Scheme中一些函数在C++里面的实现与吐槽
最终我失败了,这是显而意见,我试图在一个很看重类型是什么的语言中实现无类型操作,事实上,哪怕我实现了基本的cons,car,cdr,list后面的代码也无法写下去。比如说list-n,根据n的不同返回不同的类型,这个函数只能用一些奇淫怪巧来实现,和boost的代码库源代码一样的难度,我实现is_pair这种函数的时候,压根就没用到他那个函数,实现list时候,是一个大神妹子给我了解决方案,但是后续的代码有些能写,比如求list的长度,但是反正list第n项真心无法写,不是无法写,而是无法用递归写,我真心怀疑编译器会直接当掉在实例化模版参数的过程中。说了那么多废话,上代码吧,事实上,个人认为可行解只有使用指针以及一些怪怪的奇淫怪巧
#include <utility>
#include
<iostream>
namespace scheme
{
using std::pair;
template<typename
_CAR,typename
_CDR>
pair<_CAR,_CDR> cons(_CAR
car,_CDR
cdr)
{
return std::make_pair(car,cdr);
}
template<typename
_CAR,typename
_CDR>
_CAR car(const
pair<_CAR,_CDR>& cons)
{
return
cons.first;
}
template<typename
_CAR,typename
_CDR>
_CDR cdr(const
pair<_CAR,_CDR>& cons)
{
return
cons.second;
}
template<typename
T>
struct
_is_pair
: std::tr1::false_type
{
};
template<typename
_CAR,typename
_CDR>
struct
_is_pair<pair<_CAR,_CDR>>
: std::tr1::true_type
{
};
template<typename
T>
bool is_pair(T)
{
return
_is_pair<T>::value;
}
template <typename
_CAR, typename ... _REST>
struct
_list_type
{
typedef
pair<_CAR, typename
_list_type<_REST...>::type> type;
};
template <typename
_CAR, typename ... _REST>
typename
_list_type<_CAR, _REST ...>::type list (_CAR
car, _REST ... rest)
{
return cons(car, list(rest ...));
}
/*
template<typename _CAR>
pair<_CAR,nullptr_t> list(_CAR car)
{
return cons(car,nullptr);
}
template<typename _CAR,typename ... _REST>
auto list(_CAR car,_REST ... rest) -> decltype(cons(car,list(rest ...)))
{
return cons(car,list(rest ...));
}
*/
template<typename
T>
void display(const
T& t)
{
std::cout<<t;
}
void newline()
{
std::cout<<std::endl;
}
}
最后吐槽一句,模版元编程哪怕写了无数的template<typename T>并不是意味着你可以不用类型写代码了,类型无处不在,这就是现在我对C++的看法
模版元编程不适合C++,唔,这就是我的观点了
终,欢迎来喷
Scheme中一些函数在C++里面的实现与吐槽的更多相关文章
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
- mysql中now()函数的使用,还有oracle的sysdate,可能埋下的坑
mysql中now()函数的使用,还有oracle的sysdate 在需求中如果系统中药添加当前操作的时间那么很简单的一个操作在写sql的时候直接在这个字段对应的位置写上now()函数就可以了,这样就 ...
- 程序代码中退出函数exit()与返回函数return ()的区别
程序代码中退出函数exit()与返回函数return ()的区别 exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在主函数 ...
- mysql中find_in_set()函数的使用
首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 .现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那我 ...
- QT中使用函数指针
想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*com ...
- Bash 是如何从环境变量中导入函数的
在上文中曾说到: 所谓的环境变量的真实面目其实就是个任意字符串 Bash 在启动时会将 environ 数组中包含 = 号的字符串导入成为自己的变量 Bash 在启动外部命令时会将自己内部标记为环境变 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- PHP中spl_autoload_register()函数的用法
spl_autoload_register (PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明 bool spl_autol ...
- matlab中patch函数的用法
http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...
随机推荐
- Java中的return
比如你写了一个叫getInt的类public int getInt(){ //这个类的意思就是一个具有返回值类型为int的类了 //通常如果不需要返回值的话 这里就写void....//你的具体代码r ...
- lucene学习笔记:三,Lucene的索引文件格式
Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙. 当我们真正进入到Lucene源代码之中的时候,我们会发现: Lucene的索引过程, ...
- 《Java数据结构与算法》笔记-CH3简单排序
class ArrayBub { private long[] arr; private int nElement; public ArrayBub(int size) { arr = new lon ...
- phonegap WebApp
打开网页浏览器,进入Android SDK网站(http://developer.android.com/sdk/index.html). 我们可以看到,Google官方提供了包括Windows平台在 ...
- MySQL 大表优化方案探讨
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...
- 现代程序设计——homework-07
1.写在前面 不得不很惭愧地说,在看这些博客之前,我对C++的了解仅限于上过一门特别水的关于C++的公选课.一门只有五节课的专业选修课,写过一点点符合C++语法语法规则的类C程序,偶尔在论坛.博客中看 ...
- Oracle 递归查询
现实中我们经常需要用到一些递归查询,下面我们来介绍下ORACLE中递归查询的使用. 首先我们先新建一个表来存储以上信息 create table FAMILY ( person_id INTEGER, ...
- CodeForces 682A Alyona and Numbers (水题)
Alyona and Numbers 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/A Description After fi ...
- codeforces 630J Divisibility
J. Divisibility time limit per test 0.5 seconds memory limit per test 64 megabytes input standard in ...
- 写的一个判断注册Email是否是个人邮件,而不是公司邮件的方法
以下这个方法其实也不是很全面,它只判断了hotmail, gmail和yahoo 如果你还需要加上其他认为是私人Email的Email, 只要按照同样的方法自己加上就可以了 Public void C ...