C++ 类似lisp的c++;使用参数包
我对这个问题很感兴趣,所以我不得不尝试一下,因为它让我想起了我绝对喜欢的lisp。该问题的例子如下:C++ 类似lisp的c++;使用参数包,c++,c++11,lambda,c++14,C++,C++11,Lambda,C++14,我对这个问题很感兴趣,所以我不得不尝试一下,因为它让我想起了我绝对喜欢的lisp。该问题的例子如下: auto list = [](auto ...xs) { return [=](auto access) { return access(xs...); }; }; auto length = [](auto xs) { return xs([](auto ...z) { return sizeof...(z); }); }; int main() { st
auto list = [](auto ...xs) {
return [=](auto access) { return access(xs...); };
};
auto length = [](auto xs) {
return xs([](auto ...z) { return sizeof...(z); });
};
int main()
{
std::cout << length(list(1, '2', "3")); // 3
}
现在,如果我想要一个打印函数,我需要这样写:
auto print = [](auto i)
{
std::cout << i << " ";
return i;
};
自动打印=[](自动i)
{
std::cout我不太确定这是否是您想要的,但可能有帮助:
模板
结构打印机{
模板
静态无效运行(列表xs){
返回xs([](
汽车优先/*汽车*/,,
自动…静止/*cdr,或多或少*/){
cout::run(xs);
});
};
尽管这只适用于编译时已知的列表,因为终止是通过模板参数完成的
根据您提到的问题,在顶部答案的末尾有一个链接:
foldl\uu
值得一看,它似乎完成了我必须使用helper结构的目的
可变值是,但列表的长度及其元素类型必须在编译时知道。因此,您要查找的用法是print(l)
其中auto l=list(-1,2,3,4,5,6)
,还是简单的print(1,2,3)
?我更新了原始问题,因为我成功地使打印递归。尽管我确信我已经尝试了相同的方法,并且出现了一些编译器错误。“…在编译时已知的列表”.你是说在编译时列表的长度和元素类型在哪里?而不是值?是的,我想这适用于所有这些代码,只是想让它弄清楚。谢谢你的回答。我更新了原始问题,因为我设法使打印递归。但现在我面临一个不同的问题。可能应该使用过滤器er/删除if示例,而不是打印。
auto print = [](auto i)
{
std::cout << i << " ";
return i;
};
template<typename First>
void print_helper(First f)
{
std::cout << f << std::endl;
}
template<typename First, typename... Rest>
void print_helper(First f, Rest... r)
{
std::cout << f << " ";
print_helper(r...);
}
template<typename Lambda>
void print(Lambda l)
{
l([=](auto... elements)
{
print_helper(elements...);
});
}
template<bool = true>
struct printer {
template<typename List>
static void run (List xs) {
return xs([](
auto first /* the car */,
auto... rest /* the cdr, more or less */) {
cout << first << " ";
printer<(sizeof...(rest) > 0)>::run(
list(rest...)); // building a new list every time, tough
});
}
};
template<>
struct printer<false> {
template<typename List>
static void run (List xs) {}
};
auto print = [](auto xs) {
return xs([=](auto ...z) {
printer<(sizeof...(z) > 0)>::run(xs);
});
};