最终我失败了,这是显而意见,我试图在一个很看重类型是什么的语言中实现无类型操作,事实上,哪怕我实现了基本的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. AtCoder Grand Contest 001

    B - Mysterious Light 题意:从一个正三角形边上一点出发,遇到边和已走过的边则反弹,问最终路径长度 思路:GCD 数据爆long long #pragma comment(linke ...

  2. Educational Codeforces Round 14

    A - Fashion in Berland 水 // #pragma comment(linker, "/STACK:102c000000,102c000000") #inclu ...

  3. Longest Increasing Sequence

    public class Longest_Increasing_Subsequence { /** * O(N^2) * DP * 思路: * 示例:[1,0,2,4,10,5] * 找出以上数组的L ...

  4. Homework-10 BASIC

    对于本次作业: 我的整体思路如下: 1.首先修改二维数组求最大子数组和的C语言代码,加入分步骤的当前最优解边界值,局部最优解的记录,使之支持分步执行,连续执行,回滚等功能. 2.将程序改写为Javas ...

  5. JDBC学习笔记(2)——Statement和ResultSet

    Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...

  6. WebBrowser实现编辑网页

    //1.显示网页 procedure TForm2.FormCreate(Sender: TObject); begin Panel1.Align := alTop; CheckBox1.Anchor ...

  7. 您需要来自administrators的权限才能对此文件进行更改

    今天我重装了系统,以前D盘里的一个文件夹想删除,可以一直没法删除,原先它提示"您需要来自 S-1-5-21-602162358-1284227242-682003330-500 的权限才能对 ...

  8. HDU 5723 Abandoned country (最小生成树 + dfs)

    Abandoned country 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...

  9. Linux使用locate命令定位文件

    FIND命令 很多Linux用户喜欢使用find命令来查找文件,例如他们通常喜欢这样做: find / -name 'pattern' 确实find的强大功能不仅仅用来查找文件,它能用来定位更加细节的 ...

  10. 关于三目运算符与if语句的效率与洛谷P2704题解

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...