最终我失败了,这是显而意见,我试图在一个很看重类型是什么的语言中实现无类型操作,事实上,哪怕我实现了基本的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++里面的实现与吐槽的更多相关文章

  1. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  2. mysql中now()函数的使用,还有oracle的sysdate,可能埋下的坑

    mysql中now()函数的使用,还有oracle的sysdate 在需求中如果系统中药添加当前操作的时间那么很简单的一个操作在写sql的时候直接在这个字段对应的位置写上now()函数就可以了,这样就 ...

  3. 程序代码中退出函数exit()与返回函数return ()的区别

    程序代码中退出函数exit()与返回函数return ()的区别   exit(0):正常运行程序并退出程序:   exit(1):非正常运行导致退出程序:   return():返回函数,若在主函数 ...

  4. mysql中find_in_set()函数的使用

    首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 .现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那我 ...

  5. QT中使用函数指针

    想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*com ...

  6. Bash 是如何从环境变量中导入函数的

    在上文中曾说到: 所谓的环境变量的真实面目其实就是个任意字符串 Bash 在启动时会将 environ 数组中包含 = 号的字符串导入成为自己的变量 Bash 在启动外部命令时会将自己内部标记为环境变 ...

  7. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  8. PHP中spl_autoload_register()函数的用法

    spl_autoload_register (PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明 bool spl_autol ...

  9. matlab中patch函数的用法

    http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...

随机推荐

  1. Python相关工具清单[持续更新]

    SublimeJEDI : awesome Python autocompletion with SublimeText. Awesome Python : A curated list of awe ...

  2. es 的集群状态

    es的集群状态一共有三种 : green yellow red 状态是基于 碎片的 等级进行划分的 .

  3. MingW编译virt-viewer

    在http://www.spice-space.org/download.html可以下载到windows版本的virt viewer virt-viewer-x86-0.5.7.msi和virt-v ...

  4. mysql的point类型查询处理

    mysql的point类型,很蛋疼的表示更习惯于key—value的lng,lat 假设不得不处理数据库字段poi是point类型,其中的数据为 : POINT(28.2789745229671 11 ...

  5. CodeForces 689B Mike and Shortcuts (bfs or 最短路)

    Mike and Shortcuts 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/F Description Recently ...

  6. 使用MySQL正则表达式查询

    MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定用正则表达式过滤SELECT检索出的数据. REGEXP后所跟的东西作为正则表达式处理. 代码 SELECT prod_name FR ...

  7. Linux命令之env:显示当前用户的环境变量

    Linux系统里的env命令可以显示当前用户的环境变量,还可以用来在指定环境变量下执行其他命令.下面来比较一下set,env和export命令的异同:set命令显示当前shell的变量,包括当前用户的 ...

  8. jQuery基础学习3——jQuery库冲突

    默认情况下,jQuery用$作为自身的快捷方式. jQuery库在其他库之后导入 在其他库和jQuery库都被加载完毕后,可以在任何时候调用jQuery.noConflict()函数来将变量$的控制权 ...

  9. "file:///" file 协议

    [问题] 在WLW中拖入本地图片文件,然后调试过程中,选中对应图片,看到获得的对应的html源码中,图片地址是这样的: href="file:///C:/Users/CLi/AppData/ ...

  10. 普通Jquery的ajax判断重复和formvalidator的ajaxValidator区别

    示例:1.ajax版: $("#txtTitle").blur(function () {                 $.ajax({                     ...