Instanzen von templatisierten Klassen mit bestimmten Typen verhindern



  • Hallo zusammen,

    ich würde gerne verhindern, dass man von einer (selbstgeschriebenden) templatisieren Klasse bestimmte Typen nicht zulässt.

    template <typename T>
    class Tupel{
        private:
          vector<T> tupel
       public:
            Tupel(){ } // Standard-Konstruktor
    
            Tupel(initializer_list<T> iniList){
                for(auto & elem : iniList){
                    tupel.push_back(elem);
                }
            }
    };
    

    Man soll später also Instanzen von jedem beliebigen Typ erstellen können, jedoch beispielsweise nicht mit dem Typ bool.
    Wie könnte man sowas umsetzen?
    Die Klasse oben ist nur als beispiel gedacht und erfüllt keinen richtigen Zweck.

    VG


  • Mod

    static_assert(!is_same_v<T, bool>, "Tupel darf nicht mit bool instantiiert werden");
    


  • @Columbo Ok, gibt es da keine andere Lösung? Also ich bin relativ neue und unerfahren in er C++-Welt. Ich hatte sowas im Kopf wie einen Konstruktor zu verbieten für eine bestimmten Typen. Aber ich weiß nicht, ob das überhaupt machbar ist.



  • Was gefällt dir an Columbos Vorschlag nicht? Du kannst einzelne Funktionen mit std::enable_if ausstellen.



  • @Asse sagte in Instanzen von templatisierten Klassen mit bestimmten Typen verhindern:

    @Columbo Ok, gibt es da keine andere Lösung?

    Die vorgeschlagene Lösung ist kurz, simpel in der Umsetzung, leicht zu verstehen und liefert eine klare und eindeutige Fehlermeldung für nicht-erlaubte Typen. Kurz: Sie hat alles, was eine gute Lösung ausmacht. Sicher könnte man da eventuell etwas anderes mit enable_if oder anderen TMP-Tricks zusammenschrauben. Wie immer das aber aussehen mag, es wird garantiert in jedem der eingangs genannten Punkte schlechter sein.

    Bedenke, dass man das nicht zwingend mit std::is_same machen muss. Mit anderen Standard-, oder selbstgebauten Type Traits lassen sich mit einem einzigen static_assert auch ganze Kategorien von nicht-erlaubten Typen abdecken.


  • Mod

    Wenn du als Anfanger alles von Grund auf selber verstehen möchtest: Das geht ähnlich wie das, was du mit dem Konstruktor für bestimmte Argumente vorschlägst: Du machst eine Templatespezialisierung für den Typen, aber machst dass diese Spezialisierung zu einem Compilerfehler führt. Das ist im Prinzip ähnlich zu dem, was ein static_assert macht. Das Problem dabei ist, dass das kein schön lesbarer Fehler sein wird, sondern 20 Seiten Templatebloatfehlermeldungen. Da muss man richtig Arbeit reinstecken, damit das eine schöne Meldung ergibt. Oder du bist ein internes Compilerfeature wie static_assert und hast direkt eine schöne Fehlermeldung, weil du volle Kontrolle über Fehlermeldungen hast.



  • @Asse

    Dir ist klar, dass static_assert zur Compilezeit und nicht zur Laufzeit ausgeführt wird?


Anmelden zum Antworten