Class Template specialization
-
Wenn ich eine Klasse mit Template habe und möchte nun diese Klasse für bestimmte typen spezialisieren.
Wie schaffe ich es dann nur bestimmte Methoden zu spezialiseren.template<typename T> class MyClass<T> { void DoSomething() {} void DoSomeOtherthing() {} } template<> class MyClass<int> { // void DoSomething(){} nicht spezialisieren void DoSomeOtherthing{} // spezialisieren } void main() { MyClass<int> a{}; a.DoSomething() // ist nicht verfügbar!? }
-
Ohje. Nach dem posten eingefallen.
Nur Methode spezialisieren nicht ganze Klasse.edit:
Nein geht ja auch nicht da meine Methoden ja nicht direkt ein template definieren sondern nur das von der Klasse verwenden.
Hilfe!
-
Du kannst mit enable_if die Funktion für bestimmte Typen ändern.
#include <iostream> #include <type_traits> template<typename T> struct MyClass { template<typename U = T, std::enable_if_t<std::is_same_v<U, int>, void*> = nullptr> void DoSomething() { std::cout << "int\n"; } template<typename U = T, std::enable_if_t<!std::is_same_v<U, int>, void*> = nullptr> void DoSomething() { std::cout << "default\n"; } void DoSomeOtherthing() {} }; int main() { MyClass<int> a{}; a.DoSomething(); MyClass<float> b{}; b.DoSomething(); }
Oder so:
void DoSomething() { if constexpr(std::is_same_v<int, T>) { std::cout << "int\n"; } else { std::cout << "default\n"; } }
Edit: ich habe wohl DoSomething und DoSomeOtherthing vertauscht.
-
Nein, Spezialisierungen sind eigenständige Typen, die funktional in keiner Verbindung zum Basis-Template stehen. Sie erben nichts sondern bieten nur das an, was in der Spezialisierung implementiert ist. Also ist a.DoSomething nicht verfügbar.
-
hi wob.
danke. Das habe ich in der Zwischenzeit auch raus gefunden.
template<typename U = T> war der entscheidende Punkt.std::enable_if_t<> brauche ich glaube nicht wenn ich T bzw. U in der Signatur verwende und in der Spezialisierung den entsprechenden Typ angebe
also so:
template<typename U = T> void DoSomething(U value); template<> void DoSomething(int value);