Aus normaler Funktion ein Template machen
-
Minimalbeispiel:
struct Foo{ Foo(const Foo &foo){ static_assert(0, "Objekte vom Typ Foo sind nicht kopierbar"); } };
Jetzt möchte ich, dass Foo(const Foo &foo) ein Template ist, damit das static_assert nur anschlägt, wenn der Nutzer versucht ein Foo zu kopieren und sonst nicht. Sowas wie template<> Foo(const Foo &foo) oder so.
-
Warum nicht gleich richtig?
Foo(const Foo &foo) =delete; // C++11 private: Foo(const Foo &foo); // <= C++03
-
Weil der Compiler dann sagt, dass Foo(const Foo &foo) private ist oder nicht existiert. Das ist nicht das was ich ausdrücken will.
-
Der Kopierkonstruktor existiert nicht / ist privat - Foo lässt sich nicht kopieren - Objekte vom Typ Foo sind nicht kopierbar.
Was möchtest du noch einmal ausdrücken?
-
struct Foo { template <typename = void> Foo(Foo const&) { static_assert(false, "blubb"); } };
Ungetestet.
-
Wenn Dein "Nutzer" nicht weiß, was ein privater Kopierkonstruktor bedeutet, dann sollte er vielleicht seine Finger von der Sprache lassen.
-
Wenn du deinen Usern eine Meldung mit auf den Weg geben willst, dann schreib' neben die Definition einfach ein Kommentar:
Foo(Foo const& foo) = delete; // Diese Klasse ist nicht kopierbar.
Sonst gebe ich Tachyon recht.