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.


Log in to reply