the template guide geeksforgeeks example c++ templates

template - typedef c++



Cuando un compilador puede inferir un parĂ¡metro de plantilla? (2)

A veces funciona, a veces no:

template <class T> void f(T t) {} template <class T> class MyClass { public: MyClass(T t) {} }; void test () { f<int>(5); MyClass<int> mc(5); f(5); MyClass mc(5); // this doesn''t work }

¿Hay alguna forma de piratear el ejemplo anterior? Es decir, obliga al compilador a deducir el parámetro de la plantilla del parámetro constructor.

¿Esto se solucionará en el futuro, o hay una buena razón para no hacerlo?

¿Cuál es la regla general cuando el compilador puede inferir un parámetro de plantilla?



Los parámetros de la plantilla se pueden inferir para las plantillas de función cuando el tipo de parámetro se puede deducir a partir de los parámetros de la plantilla

Entonces se puede inferir aquí:

template <typename T> void f(T t); template <typename T> void f(std::vector<T> v);

Pero no aquí:

template <typename T> T f() { return T(); }

Y no en las plantillas de clase .

Entonces, la solución habitual para su problema es crear una función de contenedor, similar a la función de biblioteca estándar std::make_pair :

template <class T> class MyClass { public: MyClass(T t) {} void print(){ std::cout<<"try MyClass"<<std::endl; } }; template <typename T> MyClass<T> MakeMyClass(T t) { return MyClass<T>(t); }

y luego llame a auto a = MakeMyClass(5); para crear una instancia de la clase.