在Boost邮件列表中,@ LouisDionne最近发布了以下创建类似元组的实体的巧妙技巧:
#include <iostream>
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
}
Run Code Online (Sandbox Code Playgroud)
实例.
聪明之处在于listlambda采用可变参数列表作为输入,并返回lambda作为输出,将另一个lambda作用于其输入.类似地,lengthlambda是一个类似列表的实体,它将sizeof...向列表的原始输入参数提供可变参数运算符.在sizeof...操作上缠绕有拉姆达的内部,使得它可以被传递给list.
问题:这个元组创作成语是否有名称?也许来自函数式编程语言,其中更常用的是高阶函数.
今天我发现了这段代码
#include <cstdio>
auto terminal = [](auto term)
{
return [=] (auto func)
{
return terminal(func(term));
};
};
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,GCC接受了它.Clang拒绝它,因为它terminal在自己的初始化器中使用并被声明auto.
我期待clang给出的错误,但它实际上是不正确的吗?或者必须接受代码?
这是关于这一点的后续问题:C++ 14中的Lambda-Over-Lambda,答案解释了代码.
它是关于lambda创建另一个lambda,在调用时,调用传递的lambda并将返回值传递给原始lambda,从而返回第二个lambda的新实例.
该示例显示了lambdas可以链接的方式.
复制原始问题:
#include <cstdio>
auto terminal = [](auto term) // <---------+
{ // |
return [=] (auto func) // | ???
{ // |
return terminal(func(term)); // >---------+
};
};
auto main() -> int
{
auto hello =[](auto s){ fprintf(s,"Hello\n"); return s; };
auto world =[](auto s){ fprintf(s,"World\n"); return s; };
terminal(stdout)
(hello)
(world) ;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否已经有了这个结构的名称,如果不是,它应该被称为什么?它是否类似于其他语言的结构?
备注:我对它是否真的有用并不感兴趣.