2010-03-17 21 views
5

¿Es un patrón/idioma común utilizar funciones gratuitas como pseudoconstructores para evitar tener que especificar explícitamente los parámetros de la plantilla?Uso de la función gratuita como pseudoconstructores para aprovechar la deducción del parámetro de la plantilla

Por ejemplo, todo el mundo sabe acerca de std::make_pair, que utiliza sus parámetros para deducir las pair tipos:

template <class A, class B> 
std::pair<A, B> make_pair(A a, B b) 
{ 
    return std::pair<A, B>(a, b); 
} 

// This allows you to call make_pair(1, 2), 
// instead of having to type pair<int, int>(1, 2) 
// as you can't get type deduction from the constructor. 

El STL también hace un uso intensivo de esto en <functional> (bind1st, not1, ptr_fun, etc ...)

Me encuentro usando esto con bastante frecuencia, entonces me preguntaba si muchas otras personas lo usan, y si hay un nombre para este patrón?

Respuesta

7

Aparentemente se llama "Object Generator". Consulte "More C++ Idioms" y "Boost" sobre este tema.

Personalmente lo encuentro muy útil y lo uso mucho.

Además, creo que se pueden ver las plantillas de expresión como una forma especial de generadores de objetos, ya que lo único que hacen es construir tipos complejos mediante tipos de operandos y datos que normalmente también se pueden especificar manualmente. Excepto, ellos están llamando a los generadores implícitamente

a + b + c => 
    Add<Add<A, B>, C>(...) 
+1

Yo ciertamente prefiero el "generador de objetos", porque la "función del generador" ya tiene un significado matemático. –

+0

@Poita_ de acuerdo. Ahora veo que es un nombre bien conocido y parte de los documentos de refuerzo, así que creo que también los llamaré generadores de objetos :) –

+0

Me encanta este idioma, y ​​en combinación con 'auto' puedes hacer complejas construcciones de plantillas sin que en realidad sea explícitamente especificando un parámetro de plantilla. – GManNickG

Cuestiones relacionadas