在编译时获取捕获 Lambda 的类型
Get Type of Capture Lambda at Compile Time
我正在尝试创建一个 class 捕获 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)>
中插入 lambdas(不止一个)并使 callbacks
成为
std::unordered_map<uint16_t, std::function<void(const uint8_t, const size_t)>>
我正在尝试创建一个 class 捕获 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)>
中插入 lambdas(不止一个)并使 callbacks
成为
std::unordered_map<uint16_t, std::function<void(const uint8_t, const size_t)>>