2011-08-04 10 views
5

¿Es posible de alguna manera prohibir el uso de la función de plantilla para los tipos para los que no se ha escrito explícitamente la especialización? Me refiero a algo asíplantilla no especializada de bloque C++

template <typename T> 
void foo(){} 

template <> 
void foo<int>(){} 

int main(int argc, char* argv[]){ 
    foo<int>(); //ok 
    foo<char>(); //Wrong - no specialized version for char. 
} 

no puedo saltar versión genérica de la función, porque entonces el compilador dice, de que fu no es una función de plantilla cuando intento especializarse. Simplemente podría escribir algo que no compila en una función genérica, y agregar algún comentario explicando por qué, pero esto sería bastante no informativo. Lo que me gustaría hacer es poder hacer que el compilador genere un error como "foo() no está definido".

Respuesta

13

Claro: simplemente no lo definen y obtendrá un error de vinculador si intenta usarlo:

template <typename T> 
void foo(); // not defined 

template <> 
void foo<int>() { } 

Como alternativa, puede utilizar alguna variación de una aserción estática para dar un "más agradable "error en tiempo de compilación". Aquí hay un ejemplo con C++ 0x static_assert. Tenga en cuenta que debe hacer que el valor false dependa del parámetro de plantilla, de lo contrario, el static_assert se puede activar cuando se analiza la plantilla.

template <typename T> 
struct dependent_false { enum { value = false }; }; 

template <typename T> 
void foo() 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
} 

Tenga en cuenta que por lo general es mejor not to specialize function templates. En su lugar, es mejor delegar en una plantilla de clase especializada:

template <typename T> 
struct foo_impl 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
}; 

template<> 
struct foo_impl<int> 
{ 
    static void foo() { } 
}; 

template <typename T> 
void foo() 
{ 
    return foo_impl<T>::foo(); 
} 
4

Claro, simplemente no proporciona la definición de la plantilla genérica predeterminada.

Cuestiones relacionadas