2012-03-23 15 views
5

Quiero utilizar las funciones variables de tipo seguro introducidas en C++ 11, pero no con diferentes tipos. Un ejemplo:funciones variables de tipo seguro con parámetros del mismo tipo

template<typename T> 
T maxv(T first, T second) { 
    return first > second ? first : second; 
} 

template<typename T, typename ... Rest> 
T maxv(T first, T second, T ... rest) { 
    return maxv(first, maxv(second, rest)); 
} 

El tipo de todos los parámetros son los mismos, por lo que es quizá posible escribir algo así:

struct Point { int x,y; }; 

template<> 
Point maxv(Point first, Point second) { 
    return first.x > second.x ? first : second; 
} 

maxv({1, 2}, {3, 4});   // no problem  
maxv({1, 2}, {3, 4}, {5, 6}); // compile error 

Compila con este error en MinGW g ++ 4.5:

error: no matching function for call to 'maxv(<brace-enclosed initializer list>, <brace-enclosed initializer list>, <brace-enclosed initializer list>)' 

Debido a que no saben que es de tipo {5, 6}Point. ¿Cuál es la solución?

+0

Por favor s/variable/variadic/ –

+1

Tengo que preguntar, ¿sus datos están realmente almacenados en múltiples variables no agregadas donde algo como 'max_element' no es apropiado? –

+0

No especializas la función, pasa un predicado en su lugar. – Xeo

Respuesta

10

La solución es no para usar plantillas variadic! Cuando se usan con plantillas de funciones, se pretende deducir los tipos de argumentos. Eso no es lo que quieres hacer: quieres que los argumentos tomen el tipo esperado.

no tengo mucha experiencia práctica con esto, pero te gustaría utilizar listas de inicializador para esto:

Point maxv(std::initializer_list<Point> list) { 
    ... 
} 

Es posible que se quejan de que no se puede utilizar esto con tipos arbitrarios, pero luego necesitas darte cuenta de que necesitas decir en algún lugar de qué tipo se trata. ... Y se puede hacer una plantilla aunque necesitaría especificar el tipo de argumento.

Cuestiones relacionadas