tipos template programacion plantillas orientada objetos funciones ats c++ templates stl operator-overloading generic-programming

programacion - use templates c++



¿Por qué es std:: less una plantilla de clase? (3)

Así es como lo hicimos en C ++ 98. Ahora que entendemos las plantillas y el reenvío mejor (con 14 años de experiencia), los tipos de funciones más recientes hacen lo que usted dijo: el operador de llamada a función es una función de plantilla.

De acuerdo con 20.8.5 §1, std::less es una plantilla de clase con una función miembro:

template<typename T> struct less { bool operator()(const T& x, const T& y) const; // ... };

Lo que significa que debo mencionar el tipo al crear una instancia de la plantilla, por ejemplo, std::less<int> . ¿Por qué no es std::less una clase normal con una plantilla de función miembro?

struct less { template<typename T, typename U> bool operator()(const T& x, const U& y) const; // ... };

Entonces podría simplemente pasar std::less a un algoritmo sin el argumento de tipo, que puede ser peludo.

¿Es esto solo por razones históricas, porque los compiladores tempranos (supuestamente) no soportaban muy bien las plantillas de función de miembro (o quizás incluso), o hay algo más profundo en ello?


Es así que la clase creada por la plantilla instanciada tiene definiciones de tipo anidadas que proporcionan información de tipo sobre el tipo de resultado y los tipos de argumento del functor:

template <class Arg1, class Arg2, class Result> struct binary_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; }; template <class T> struct less : binary_function <T,T,bool> { bool operator() (const T& x, const T& y) const; };

std::less hereda de std::binary_function , que produce estas definiciones de tipo. Así, por ejemplo, puede extraer el tipo de resultado usando std::less<T>::result_type .

Hoy en día, esto es casi innecesario con auto palabras clave decltype y auto C ++ 11.


La propuesta de Stephan de cambiar esto para que todos los objetos de función sean polimórficos en su operator() fue aceptada en la reunión anterior, es mi entendimiento.

Entonces, la respuesta a su pregunta "¿por qué el operador de llamada de función no tiene plantilla?", Es que lo es.