Sì. Rendere i modelli di funzione e poi conditionaly consentire loro utilizzando std::enable_if
:
#include <type_traits>
template <class T>
class A {
public:
template<typename U = T>
typename std::enable_if<std::is_same<U,int>::value>::type
has_int() {}
template<typename U = T>
typename std::enable_if<std::is_same<U,char>::value>::type
has_char() {}
};
int main()
{
A<int> a;
a.has_int(); // OK
// a.has_char(); // error
}
La soluzione da the other answer potrebbe non essere fattibile se la classe è grande e ha molte funzioni che devono prescindere dalla T
. Ma puoi risolverlo ereditando da un'altra classe che viene utilizzata solo per questi metodi speciali. Quindi, puoi specializzare solo quella classe base.
In C++ 14, ci sono di tipo convenienti alias così la sintassi può diventare:
std::enable_if_t<std::is_same<U, int>::value>
e C++ 17, ancora più breve:
std::enable_if_t<std::is_same_v<U, int>>
Non è possibile combinare istruzioni per il preprocessore con l'istanza del modello del compilatore C++. –
intendi 'A b', giusto? –
qdii
related: [specializzazione template class C++, senza dover reimplementare tutto] (http://stackoverflow.com/q/25486033/3953764) –