C ++ / C ++ 11 - оператор Switch для шаблонов с переменным числом аргументов?
Допустим, у меня есть несколько таких структур:
struct MyStruct1 {
inline void DoSomething() {
cout << "I'm number one!" << endl;
}
};
struct MyStruct2 {
static int DoSomething() {
cout << "I'm the runner up." << endl;
return 1;
}
};
struct MyStruct3 {
void (*DoSomething)();
MyStruct3() {
DoSomething = &InternalFunction;
}
static void InternalFunction() {
cout << "I'm the tricky loser." << endl;
}
};
Как вы видите, для всех трех структур я могу вызвать DoSomething () для объекта этой структуры и заставить его работать (хотя это достигается по-разному для каждой структуры):
MyStruct1 a;
MyStruct2 b;
MyStruct3 c;
a.DoSomething(); // works, calls Struct1's instance function
b.DoSomething(); // works, calls Struct2's static function, discards return value
c.DoSomething(); // works, calls Struct3's function pointer
Теперь, допустим, я поместил произвольный выбор этих структур в кортеж:
tuple<MyStruct2, MyStruct3, MyStruct2, MyStruct1> collection;
Давайте также скажем, что я хочу взять один из этих элементов и запустить егоDoSomething()
функция на основе индекса, который определяется во время выполнения. Чтобы достичь этого, я мог бы использовать оператор switch:
switch(index) {
case 0: get<0>(collection).DoSomething(); break;
case 1: get<1>(collection).DoSomething(); break;
case 2: get<2>(collection).DoSomething(); break;
case 3: get<3>(collection).DoSomething(); break;
}
Это работает отлично и изящно, но становится очень утомительным, повторяющимся и подверженным ошибкам, когда это должно быть сделано с несколькими по-разному расположенными (и потенциально намного более длинными, чем 4-элементными) кортежами. Было бы очень удобно, если бы оператор switch мог быть автоматически сгенерирован на основе количества элементов в шаблоне variadic. псевдокод:
template <typename... T>
void DoSomethingByIndex(int index, tuple<T...>& collection) {
switch(index) {
STATIC_REPEAT(sizeof...(T), X) {
case X: get<X>(collection).DoSomething(); break;
}
}
}
Есть ли механизм в C ++ 11, который позволил бы мне достичь этого? Если нет, я знаю, что, несомненно, смогу взломать решение со списком указателей функций в шаблоне, но мне просто любопытно, если что-то подобное существует, так как оно лучше подходит для моих целей. Я уверен, что сгенерированный компилятором список переходов оператора switch будет более эффективным, чем мой самодельный указатель на функцию.