dv_*_*dv_ 10 c++ lambda traits c++11
我有一个关于C++ 0x lambdas的问题.在我的代码中,知道给定类型是否是C++ 0x lambda表达式的类型将是有益的.举个例子:
struct foobar
{
void operator()()
{
}
};
auto lambda = []{};
typedef is_lambda < decltype(lambda) > ::type T; // T would be a true_type
typedef is_lambda < foobar > ::type T; // T would be a false_type
Run Code Online (Sandbox Code Playgroud)
将lambda表达式与函数和成员函数类型区分开来相当容易.函子是另一回事.
我在这里看到的问题是根据即将推出的C++ 0x标准定义lambda表达式; 唯一必须定义的是公共呼叫运营商.然而,对于仿函数也是如此; 测试调用操作符的存在是不足以区分lambda表达式和仿函数.此外,如果不存在仿函数的运算符,则会发生编译器错误,因为SFINAE不适用.这是什么时候发生的?仿函数的调用操作符可能是模板化的.所以,这样的代码:
typedef decltype(&T::operator()) call_type;
Run Code Online (Sandbox Code Playgroud)
将使用非模板化调用运算符的lambda表达式和仿函数,并为模板化调用运算符生成编译器错误.
我相信is_lambda < >只能使用内部编译器功能创建特征.你看到了如何实现这个特性的方法吗?
由于lambda的计算导致创建闭包对象,因此只要对象传递给函数或复制,就没有任何区别.而且,坦率地说,我无法想象一个问题需要知道一个物体是否来自lambda.
编辑.标准甚至在5.1.2/2中有一个注释:
注意:闭包对象的行为类似于函数对象(20.8).- end note
| 归档时间: |
|
| 查看次数: |
2066 次 |
| 最近记录: |