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

Jar*_*ock 6 c++ lambda template-meta-programming

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

因为分配给lambda对象是非法的,所以我想以my_struct这样一种方式实现赋值运算符:when 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());
  }
};
Run Code Online (Sandbox Code Playgroud)

Xeo*_*Xeo 9

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

§5.1.2 [expr.prim.lambda] p3

的类型的λ-表达(这也是封闭的对象的类型)是一个唯一的,不连无名类型[...]


小智 5

大概你也不想分配不可赋值的非lambda函数,所以你可以使用std::is_assignable.

  • @MatthewHolder 这仍然没有抓住重点。您应该检测是否可以将该类型用作基类。非类类型不能从中派生。最终类不能从任何一个派生出来。在编译器不允许从 lambda 派生的情况下,检测是否可以从类型派生应该已经涵盖了 lambda 以及所有其他场景。在编译器确实允许从 lambda 派生的情况下,检测您是否可以从类型派生可以防止误报。 (2认同)