Если вам нужны определенные функции из переменной времени выполнения, используйте вместо этого map
. Шаблон - неподходящий инструмент для работы, так как вам нужно писать много, чтобы преобразовать переменную в константу.
Предполагая, что у вас enum
есть значение по умолчанию None
и что у вас есть до 5 аргументов, вы можете определить карту следующим образом:
enum MyEnum { None = 0, A, B, C, D... };
using MyKey = std::tuple<MyEnum, MyEnum, MyEnum, MyEnum, MyEnum>;
using MyFunction = std::function<void()>;
Тогда у вас есть где-то карта функции (синглтон)
std::map<MyKey, MyFunction> myMap;
Полезная функция может быть полезна для создания ключа из переменного числа аргументов:
MyKey MakeKey(MyEnum e1, MyEnum e2 = None, MyEnum e3 = None, MyEnum e4 = None, MyEnum e5 = None)
{
return std::make_tuple(e1, e2, e3, e4, e5);
}
myMap.emplace(MakeKey(A, B), [](){ /* some code */ });
MyEnum AtOrDefault(const vector<enum> &eVec, int index)
{
return index < eVec.size() ? eVec[index] : None;
}
Тогда, если вы хотите вызвать соответствующую функцию из вектора, вы можете сделать:
void f(const vector<enum> &eVec)
{
if (eVec.size() > 5) throw some_exception;
MyKey key = std::make_typle(
AtOrDefault(eVec, 0),
AtOrDefault(eVec, 1),
AtOrDefault(eVec, 2),
AtOrDefault(eVec, 3),
AtOrDefault(eVec, 4));
auto &fn = myMap[key];
fn();
}
Вы также можете использовать идею вычисления значения, предполагая, что вы знаете максимальное количество элементов в перечислении. Затем вы можете создать CombinedEnumType:
enum CombinedEnumType : uint32_t { };
и определил функцию
CombinedEnumType MakeCombinedEnumType(MyEnum e1, … MyEnum e5 = None)
{
const int MyEnumEcount = 5;
MyEnum a[] = { e1, e2, e3, e4, e5 };
uint32_t result = 0;
for (auto & item : a) { result *= MyEnumEcount; result += item; }
return static_cast<CombinedEnumType>(result);
}
Этот код только для идей. В реальном производственном коде вы должны использовать константы, собственные имена переменных, проверять, существует ли функция для данной комбинации…