我有一个关于 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
将 lambda 表达式与函数和成员函数类型区分开来相当容易。函子是另一回事。
我在这里看到的问题是根据即将到来的 C++0x 标准定义 lambda 表达式;唯一必须定义的是公共呼叫操作员。然而,对于函子也是如此;测试调用运算符的存在不足以区分 lambda 表达式和仿函数。此外,如果函子的运算符不存在,则会发生编译器错误,因为 SFINAE 不适用。这什么时候发生?函子的调用操作符可以被模板化。所以,这样的代码:
typedef decltype(&T::operator()) call_type;
将适用于具有非模板化调用运算符的 lambda 表达式和仿函数,并为模板化调用运算符生成编译器错误。
我相信is_lambda < >
只能使用内在编译器功能创建特征。您是否看到了如何实现此特征的方法?