Usando _1, _2, ... directamente no es posible con la plantilla variadic. Necesita usar macros expansivas en su lugar.
Sin embargo, puede envolver estos marcadores de posición en una fábrica con plantilla para obtener _1 con el argumento de plantilla 1, _2 para 2, etc.
implementaciones como gcc/msvc ya se definen los marcadores de posición struct como plantilla (respectivamente std :: _ marcador de posición y std :: _ Ph) para que pueda definir que la fábrica de esta manera:
struct ph_factory {
template<size_t holder>
static std::_Placeholder<holder> make_ph() {
return std::_Placeholder<holder>();
}
};
Esto define, se puede ampliar un paquete de parámetros con todos los marcadores de posición que desee:
struct tester {
template<size_t ... holders>
void test(int val) {
auto callable = std::bind(&tester::call, this, val, ph_factory::make_ph<holders>()...);
callable('a', 42, 'c');
}
void call(int v1, char c1, int v2, char c2) {
cout << "calling :" << v1 << " " << c1 << " " << v2 << " " << c2 << endl;
}
};
Así que el siguiente código de salida "llamando al: 10 c 42 una"
int main() {
tester t;
t.test<3,2,1>(10);
}
El uso de trucos como make_indice le dará la posibilidad de lograr su objetivo original.
Hay una buena implementación de una utilidad make_indice aquí: [http://preney.ca] (http://preney.ca/paul/2011/10/16/applying-stdtuple-to-functors-efficiently/) pero estoy teniendo dificultades para entender cómo puedo usarlo con boost :: arg <> – Blizter
Ese enlace fue una gran lectura, y la función 'apply (Func, std :: tuple)' puede ser útil algún día . –
Veo 'typename ... Args'. ¿Estás usando C++ 11? – kennytm