У меня есть вопрос, несколько похожий на этот , но для более ограниченного случая, который, как я считаю, должен быть как-то возможен: я хочу построить массив вызовов функции statiti c constexpr из числа лямбды, каждая из которых имеет одну и ту же подпись. Часть stati c и constexpr здесь важна, так как я нахожусь во встроенной системе, где я хочу убедиться, что такие таблицы заканчиваются на Fla sh.
Так что в основном я хочу сделать это
#include<vector>
#include<functional>
#include<variant>
using params_t = std::vector<std::variant<int, float /*maybe others*/ >>;
struct command_t {
using callable_t = std::function<void(params_t)>;
const callable_t func;
//other members..
};
class AClass {
template<typename func_t>
constexpr static command_t::callable_t make_callable(func_t fun) {
return [fun](params_t params){/*construct a call to fun using params and template magic*/};
}
static void mycommand();
static void mycommand2(int i);
//The following fails:
///"error: in-class initialization of static data member 'const command_t AClass::commands [2]' of non-literal type"
static constexpr command_t commands[2] = {command_t{make_callable(mycommand)},
command_t{make_callable(mycommand2)}};
};
На coliru
Обратите внимание, что тип стирания здесь весьма ограничен, поскольку сигнатура лямбды изменяется только сигнатурой захвата fun
. Вызов функции, очевидно, не должен (и не может) быть constexpr, только конструкция.
Так что в основном мой вопрос заключается в том, могу ли я каким-то образом создать массив commands
static constexpr
, либо каким-либо образом используя std::function,
или что-то вроде inplace_function , или, возможно, вращая мой собственный код для стирания лямбда-типа в этом конкретном c случае?