У меня есть следующая функция, которая может принимать N аргументов разных типов и пересылает их к N функциям, шаблонным для каждого отдельного типа, таким образом (пример с двумя аргументами):
template <typename T1, typename T2>
bool func(int& counter, T1 x1, T2 x2) {
switch (counter) {
case 0:
if (func2<T1>(x1)) {
counter++;
return true;
} else {
return false;
}
case 1:
if (func2<T2>(x2)) {
counter++;
return true;
} else {
return false;
}
default:
return true;
}
}
Я хочу написать эту функцию с вариационными шаблонами, чтобы она могла обрабатывать любое количество аргументов безопасным способом. Я вижу решение, использующее рекурсивные функции, проходящее по счетчику и вариационный индекс и сравнивающее их для равенства, но это, казалось бы, дает гораздо менее эффективный код, чем оператор switch выше (последовательность if-проверок по сравнению с таблицей переходов).
Можно ли это сделать эффективно с использованием метапрограммирования шаблонов или мне нужно обеспечить перегрузки для каждой из них?