如何在编译时检测类型是否为lambda表达式
How to detect whether a type is a lambda expression at compile time?
假设我有一个类型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
。
相关文章:
- 标准是否保证无捕获的 lambda 为空?
- 它是否定义了哪些算法可以接受可变 lambda 的实现?
- 是否可以将具有不同签名的 lambda 存储在 std::vector 中并在函数中执行它们(使用各自的参数)?
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- 是否可以将带有捕获和参数的 lambda 传递给另一个函数?如果是这样,如何?
- 在C++17中,lambda是否可以作为模板参数传递
- 将此lambda传递给"unique_ptr"是否可以终身使用
- 是否创建具有不同返回类型的lambda
- 是否允许在作为静态数据结构成员的lambda函数中捕获变量
- 在Qt中使用C++Lambda函数作为插槽是否有助于保持库的二进制兼容性?
- 在C++中,是否可以编写一个条件的lambda,即只是一个计算结果为真或假的条件
- 模板函数中的无捕获 lambda 是否具有多个二进制实现?
- lambda 的调用运算符是否需要具有链接?
- 是否可以指定 C++20 个模板化 lambda 来推断嵌套在参数中的类型?
- 结构化绑定语法是否可以在多态 lambda 中使用
- 是否可以使用默认泛型参数在C++中定义 lambda?
- 插入向量时,使用lambda的返回而不是函数的返回是否有意义?
- C++14 及更高版本是否允许 Lambda 函数的默认参数?如果是这样,怎么办?
- 假设相同的 lambda 表达式具有不同的类型是否安全?