c++ - Icteridad del constructor de la plantilla
templates (2)
Creo que quiere saber cómo crear una instancia de esta clase con C como SomeType:
template<typename A>
class foo
{
template<typename B, typename C>
foo(B b)
{
C c;
}
};
No sé si esto es posible.
Posible duplicado:
¿Se pueden especificar explícitamente los parámetros de plantilla de un constructor?
dando seguimiento a mi pregunta anterior, (encontré esta situación en la edición 2)
Desplegado simple en el código:
#include <iostream>
struct Printer
{
Printer() { std::cout << "secret code" << std::endl; }
};
template <class A>
struct Class
{
template <class B, class C>
Class(B arg)
{
C c; /* the ''secret code'' should come from here */
std::cout << arg << std::endl;
}
Class(double arg) { std::cout << "double" << std::endl; }
Class(float arg) { std::cout << "float" << std::endl; }
/* this forbids the use of printer in the first parameter */
Class(Printer printer) { throw std::exception(); /* here be dragons */ }
};
int main()
{
Class<int> c(1.0f);
Class<int>* ptr = new Class<int>((double)2.0f);
return 0;
}
// Can anyone print ''secret code'' while creating an object of type ''Class'' ?
Detallado: para un constructor de plantilla, ¿puede especificar un argumento de plantilla que no forme parte de los argumentos del constructor cuando se crea una instancia de un objeto?
Creo que esto merece una pregunta propia.
No, no es posible.
No hay sintaxis con la que pueda proporcionar parámetros de plantilla explícitos a una plantilla de constructor. Solo puede proporcionar parámetros de plantilla explícitos para la plantilla de clase como un todo.
El siguiente texto de [temp.arg.explicit]
(texto de 2003, 14.8.1 / 5) cubre el escenario. Aunque la cláusula no es normativa, sirve para explicarnos que, como restricción inherente de la gramática, esto no es posible:
Nota: debido a que la lista de argumentos de plantilla explícita sigue el nombre de la plantilla de función, y debido a que las plantillas de función miembro de conversión y las plantillas de funciones miembro constructor se llaman sin usar un nombre de función , no hay forma de proporcionar una lista explícita de argumentos de plantilla para estas plantillas de función .
Esto, en parte, se debe al hecho de que nunca invocas al constructor explícitamente. Cuando escribe, digamos, A()
no está llamando al constructor como una función, aunque parezca que sí lo es ("las plantillas de función de miembros de conversión y las plantillas de funciones miembro de constructor se llaman sin usar un nombre de función").