Ja. Nehmen Sie die Funktionsschablonen und dann conditionaly ermöglichen sie std::enable_if
mit:
#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
}
Die Lösung von the other answer nicht möglich sein könnte, wenn die Klasse groß und hat viele Funktionen bekommen, die unabhängig von T
benötigen. Sie können dies jedoch lösen, indem Sie von einer anderen Klasse erben, die nur für diese speziellen Methoden verwendet wird. Dann können Sie nur diese Basisklasse spezialisieren.
In C++ 14 gibt es bequeme Art Aliase so die Syntax werden kann:
std::enable_if_t<std::is_same<U, int>::value>
und C++ 17, noch kürzer:
std::enable_if_t<std::is_same_v<U, int>>
Sie nicht Präprozessoranweisungen mischen mit der Template-Instanziierung des C++ Compilers. –
meinst du 'A b', richtig? –
qdii
verwandt: [C++ Klassenvorlage Spezialisierung, ohne alles neu zu implementieren] (http://stackoverflow.com/q/25486033/3953764) –