是C++ is_lambda特性,纯粹作为库实现,不可能吗?

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 < >只能使用内部编译器功能创建特征.你看到了如何实现这个特性的方法吗?

Gen*_*yev 8

由于lambda的计算导致创建闭包对象,因此只要对象传递给函数或复制,就没有任何区别.而且,坦率地说,我无法想象一个问题需要知道一个物体是否来自lambda.

编辑.标准甚至在5.1.2/2中有一个注释:

注意:闭包对象的行为类似于函数对象(20.8).- end note


Pup*_*ppy 6

我不相信它可以完成 - lambdas在语义上并不是真正的新东西,它们只是编译器生成的仿函数,因此看起来与常规仿函数相同.