如何在编译时检测类型是否是lambda表达式?

时间:2011-12-12 22:44:56

标签: c++ lambda template-meta-programming

假设我有一个类型my_struct包含一个成员变量f,这是一个函数。 f可能是c ++ 11 lambda函数。

因为分配给lambda对象是非法的,所以我想实现my_struct的赋值运算符,这样当f是lambda时,它就不会被赋值。

是否可以构建一个类型特征is_lambda,它可以检查lambda-ness的类型?

在代码中:

#include <type_traits>

template<typename Function> struct is_lambda
{
  // what goes here?
};

template<typename Function> struct my_struct
{
  Function f;

  my_struct &do_assign(const my_struct &other, std::true_type)
  {
    // don't assign to f
    return *this;
  }

  my_struct &do_assign(const my_struct &other, std::false_type)
  {
    // do assign to f
    f = other.f;
    return *this;
  }

  my_struct &operator=(const my_struct &other)
  {
    return do_assign(other, typename is_lambda<Function>::type());
  }
};

2 个答案:

答案 0 :(得分:9)

没有编译器支持是不可能的,因为lambda的类型只是普通的非联合类类型。

§5.1.2 [expr.prim.lambda] p3

  

lambda-expression 的类型(也是闭包对象的类型)是一个唯一的,未命名的非联盟类类型[...]

答案 1 :(得分:5)

据推测,您不希望分配不可分配的非lambda函数,因此您可以使用std::is_assignable