在编译时获取捕获 lambda 的类型
Get Type of Capture Lambda at Compile Time
我正在尝试创建捕获lambda的类静态映射,但是在编译时获取类型以馈送到映射模板中时遇到了一些困难。
这是 lambda 签名...
[=] (const uint8_t *buffer, const size_t bufferSize) -> void
{
//stuff
};
我正在尝试存储在这样的地图中...
constexpr static auto generateExampleLambda(void) {
auto lambda = [=] (const uint8_t *buffer, const size_t bufferSize) -> void
{
//stuff
};
return lambda;
}
constexpr static inline auto exampleLambda = generateExampleLambda();
constexpr typedef decltype(exampleLambda) LambdaType;
static inline std::unordered_map<uint16_t, LambdaType> callbacks;
但显然这不能编译。我已经让它在没有捕获的情况下工作,但当然这是最简单的情况,哈哈。
不幸的是,每个lambda都有自己的类型。
为了明确这一点,您可以验证
auto l1 = []{};
auto l2 = []{};
static_assert( false == std::is_same_v<decltype(l1), decltype(l2)>, "!" );
// ............^^^^^
因此,我认为不可能使用lambda的类型为不同的lambda创建映射。
我能想象的最好的方法是在某些std::function<void(const uint8_t, const size_t)>
中插入 lambda(不止一个)并callbacks
std::unordered_map<uint16_t, std::function<void(const uint8_t, const size_t)>>
相关文章:
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 在 lambda 捕获中声明的变量的类型推导
- C++ 模板类型的静态 lambda 成员的构造
- Clang 工具,用于提取给定 lambda 类型的 lambda 主体
- 如果 lambda 没有指定的类型,std::function 如何接受 lambda?
- Lambda可以用作非类型模板参数吗
- 如何确定捕获不可复制参数的 lambda 的类型?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- C++模板函数中,指定回调函子/lambda 的参数类型,同时仍允许内联?
- 运算符中的不同类型? 具有无捕获,相同的签名,lambda
- 通过参数传递 lambda(无函数类型模板)
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- C++ 中的 Java8 lambda 类型比较
- 推断衰减到函数指针的 lambda 类型
- 从 lambda 内部返回 C++11 中的 lambda 类型(平面映射函数)
- 如何强制编译器识别模板化函数中的lambda类型
- 初始化和 lambda 类型参数
- 具有相同签名和捕获的常见 lambda 类型
- 我可以在std::函数中使用模板类型T来传递lambda类型的函数C++11吗
- C++ upper_bound 对 <lambda 类型的对象没有匹配的函数调用