У меня есть класс, зависящий от целочисленного параметра шаблона. В какой-то момент в моей программе я хочу использовать один экземпляр этого шаблона, в зависимости от значения этого параметра, определенного во время выполнения. Вот простой пример, демонстрирующий, как я буду это делать в настоящее время, используя большой оператор switch:
#include <string>
#include <iostream>
#include <type_traits>
template<unsigned A>
struct Wrapper {
typedef typename std::conditional<A==1, int, float>::type DataType;
DataType content[A];
void foo() {
std::cout << A << std::endl;
};
};
int main(int argc, char *argv[])
{
std::string arg = argv[1];
int arg_int = std::stoi(arg);
switch (arg_int) {
case 1: {
Wrapper<1> w;
w.foo();
break;
}
case 2: {
Wrapper<2> w;
w.foo();
break;
}
case 3: {
Wrapper<3> w;
w.foo();
break;
}
default:
return 1;
};
return 0;
}
Это быстро станет громоздким, если у меня есть не только один параметр A
, но несколько аргументов шаблона в разных комбинациях. Предположим также, что на самом деле существует действительно хорошая причина для реализации A как параметра шаблона.
Есть ли способ заменить огромный оператор switch почти идентичными операциями case, например. используя некоторую магию метапрограммирования от Boost или взлома препроцессора?
В идеале я хотел бы написать что-то вроде следующего:
INSTANTIATE_DEPENDING(i, {1, 2, 3},
{
Wrapper<i> w;
w.foo();
}
);