最终我失败了,这是显而意见,我试图在一个很看重类型是什么的语言中实现无类型操作,事实上,哪怕我实现了基本的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++,唔,这就是我的观点了
终,欢迎来喷