¿Plantillas variables y declaración de cambio?

Tengo la siguiente función que puede tomar N argumentos de diferentes tipos y reenviarlos a N funciones con plantilla en cada tipo individual, de esta manera (ejemplo con dos argumentos):

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;
    }
}

Quiero escribir esta función con plantillas variadas para que pueda manejar cualquier número de argumentos de forma segura. Puedo ver una solución usando funciones recursivas, pasando el contador y el índice variable y comparándolos para la igualdad, pero esto parecería producir un código mucho menos eficiente que la declaración de cambio anterior (una secuencia de verificaciones si se compara con una tabla de salto )

¿Se puede hacer esto de manera eficiente usando la metaprogramación de plantillas o necesito proporcionar sobrecargas para cada aridad?

Respuestas a la pregunta(5)

Su respuesta a la pregunta