在编译时获取捕获 lambda 的类型

Get Type of Capture Lambda at Compile Time

本文关键字:lambda 类型 编译 获取      更新时间:2023-10-16

我正在尝试创建捕获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)>>