Me gustaría definir una función de plantilla pero no permitir la creación de instancias con un tipo particular. Tenga en cuenta que, en general, todos los tipos están permitidos y la plantilla genérica funciona, solo quiero prohibir el uso de algunos tipos específicos.No permitir una instancia de plantilla de función específica
Por ejemplo, en el siguiente código deseo evitar el uso de double
con la plantilla. Esto en realidad no evita la creación de instancias, solo causa un error de enlazador al no tener la función definida.
template<typename T>
T convert(char const * in)
{ return T(); }
//this way creates a linker error
template<>
double convert<double>(char const * in);
int main()
{
char const * str = "1234";
int a = convert<int>(str);
double b = convert<double>(str);
}
El código es sólo una demostración, obviamente, la función de conversión debe hacer algo más.
Pregunta: En el código anterior, ¿cómo puedo producir un error de compilación al intentar utilizar la creación de instancias convert<double>
?
La pregunta relacionada más cercano que puedo encontrar es How to intentionally cause a compile-time error on template instantiation Se trata de una clase, no una función.
La razón por la que necesito hacer esto es porque los tipos que deseo bloquear realmente compilarán y harán algo con la versión genérica. Sin embargo, se supone que no es parte del contrato de la función y puede no ser compatible con todas las plataformas/compiladores y en versiones futuras. Por lo tanto, me gustaría evitar que se use en absoluto.
Usted ya ha hecho eso, ¿verdad? – Nawaz
No, eso da un error del enlazador sobre una función faltante. Ese error tampoco le dirá dónde está el problema, simplemente le indicará en qué módulo se encuentra. –
Podría desencadenar un error en tiempo de compilación utilizando 'static_assert':' template <> foo (const char *) {static_assert (false, "no permitido"); } ' –
evnu