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

时间:2019-02-02 19:21:37

标签: c++ lambda 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;

但是显然这不能编译。我已经使其无法捕获,但是当然这是简单的情况。

1 个答案:

答案 0 :(得分:2)

不幸的是,每个lambda都有自己的类型。

为证明这一点,您可以验证

auto l1 = []{};
auto l2 = []{};

static_assert( false == std::is_same_v<decltype(l1), decltype(l2)>, "!" );
// ............^^^^^

因此,我认为不可能为具有lambda类型的不同lambda创建地图。

我可以想像的最好的是插入件中的一些的lambda(多于一个)std::function<void(const uint8_t, const size_t)>,使callbacks一个

std::unordered_map<uint16_t, std::function<void(const uint8_t, const size_t)>>