【发布时间】:2017-11-27 23:48:03
【问题描述】:
我已经阅读了“Effective Modern C++”的 item31 和 http://en.cppreference.com/w/cpp/language/lambda 的网页,想知道我是否可以通过其确定的类型而不是 std::function 的包装类型或 auto 的关键字来定义 lambda 和我怎样才能做到这一点。
例如,对于类型int:
auto x_1 = 5; // type deduction
int x_2 = 5; // defined by definite type
// both x_1, x_2 are int variables of value 5
现在,当问题出现在 lambda 时:
auto f_1_0 = []()->int{return 5;};
std::function<int(void)> f_1_1 = []()->int{return 5;};
SomeType f_2 = []()->int{return 5;}; // what's the SomeType here?
【问题讨论】:
-
Lambda 的类型名称无法表达。必须推断它们的类型。
-
如果您想要一个具体的类型名称,请构建一个仿函数。 Lambda 是匿名的。
-
技术上你可以,即通过重新实现
std::function,但你的实际问题似乎是你是否可以发现 lambda 的类型名:你做不到。 -
这取决于你想用 lambda 的名字做什么。如果你只是想看看编译器想出了什么,你可以使用
print_T<decltype(lambda)>()wheretemplate <typename T> print_T() { std::cout << __PRETTY_FUNCTION__ << '\n'; }。 -
@Henri "PRETTY_FUNCTION" 不是标准的东西。海合会,对吧? (我很佩服你让这个编辑器正确显示 PRETTY_FUNCTION_ 的能力。)