8

假设我有一个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());
  }
};
4

2 回答 2

10

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

§5.1.2 [expr.prim.lambda] p3

lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型 [...]

于 2011-12-12T22:46:22.170 回答
6

大概您也不想分配不可分配的非 lambda 函数,因此您可以使用std::is_assignable.

于 2011-12-12T22:51:35.920 回答