Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类似lisp的c++;使用参数包_C++_C++11_Lambda_C++14 - Fatal编程技术网

C++ 类似lisp的c++;使用参数包

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

我对这个问题很感兴趣,所以我不得不尝试一下,因为它让我想起了我绝对喜欢的lisp。该问题的例子如下:

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);
 });
};