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

How to detect whether a type is a lambda expression at compile time?

本文关键字:是否 lambda 表达式 类型 检测 编译      更新时间:2023-10-16

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

因为给lambda对象赋值是非法的,所以我想实现my_struct的赋值操作符,当f是lambda时,它不被赋值。

是否有可能建立一个类型trait 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());
  }
};

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

§5.1.2 [expr.prim.lambda] p3

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

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