if constexpr um funktionen zu deaktivieren



  • Ich möchte gerne in einer Klasse mittels "if constexpr" bestimmte Konstruktoren zur Compile Zeit deaktivieren. Ist das möglich?

    Ich schaffe es bisher nur, if constexpr innerhalb von funktionen zu verwenden



  • Sewing schrieb:

    Ich möchte gerne in einer Klasse mittels "if constexpr" bestimmte Konstruktoren zur Compile Zeit deaktivieren. Ist das möglich?

    Ich schaffe es bisher nur, if constexpr innerhalb von funktionen zu verwenden

    Ich behaupte hier mal einfach "nein". Der Grund ist, dass ja das "if constexpr" innerhalb eines Konstruktors ist, dieser also auf jeden Fall exisiert und aufgerufen werden kann. Du kannst nur unterschiedliche Versionen je nach Bedingung erzeugen, nicht aber die gesamte Funktion entfernen. Dazu wirst du wohl ein enable_if brauchen, sodass die entsprechende Funktion schon gar nicht gewählt werden kann.



  • das dachte ich mir

    habs jetzt zunächst mal über macros gemacht 😕

    danke jedenfalls für deine Antwort



  • So, template-Experten bitte kritisiert mich, ich bin da eher so auf try+error unterwegs:

    #include <type_traits>
    #include <string>
    
    template <size_t N>
    struct S {
        S(int) : i(1) {}
    
        template<size_t X = N, std::enable_if_t<X <= 5, void*> = nullptr>
        S(double) : i(2) {}
    
        int i;
    };
    
    int main() {
        S<11> s(1.2);
        return s.i;
    }
    

    Bei S<0> bis S<5> exisiert der 2. constructor, ab S<6> nicht mehr. Wüsste nicht, wie das mit "if constexpr" gehen sollte. Aber wer weiß... 🙂



  • Kommt darauf an, was mit 'deaktivieren' gemeint ist. Das geht zum Beispiel entweder einfach mit static_assert, sodass Bestimmtes nicht erlaubt ist oder durch SFINAE, um den passenden auszuwählen.