Получить тип захвата лямбда во время компиляции - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь создать статическую карту класса для захвата лямбда-выражений, но испытываю некоторые затруднения при получении типа во время компиляции для подачи в шаблон карты.

это лямбда-сигнатура ...

[=] (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 голосов
/ 02 февраля 2019

К сожалению, у каждой лямбды есть свой тип.

Чтобы сделать это очевидным, вы можете проверить, что

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

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

Так что я не думаю, что можно создать карту для разныхлямбды с типом лямбды.

Лучшее, что я могу себе представить, это вставить лямбды (более одного) в некоторые std::function<void(const uint8_t, const size_t)> и сделать callbacks a

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