Konstruktor erzeugen wenn notwenig



  • Einen schönen guten Tag,
    ich habe eine kurze Frage, ob dies mit C++ möglich ist:
    Ich möchte gerne einen Konstruktor nur bei Bedarf erzeugen

    template<size_t X>
    class Foo{
    
    public: //FALLS X > 1000
    
       Foo(int x){}
    //Andernfalls 
       Foo() {}
    };
    

    Mir ist klar, dass ich die klasse für den Fall > 1000 spezialisieren kann.
    Ich würde aber nur sehr viel Quellcode doppeln und das würde ich gerne vermeiden!
    Also bitte nicht mit dem Vorschlag kommen

    template<size_t X,bool C = IF_TRAIT<X,1000>::value>
    class Foo;
    
    template<size_t X>
    class Foo<X,true>{
      Foo(int x){}
    }
    
    template<size_t X>
    class Foo<X,false>{
      Foo(){}
    }
    

    Hat jemand eine Idee ?



  • Habe gerade vor 4 Tagen im Thread if constexpr um funktionen zu deaktivieren eine mögliche Lösung gepostet.



  • Mach eine Basisklasse, bei der der verbotene Konstruktor protected ist. Dann definierst Du Dein Klassentemplate, das von Deiner Basis erbt. Deine Spezialisierung des Templates braucht dann nur den protected contructor der Basis aufrufen.

    VG
    BTW: Was ist denn Dein use case?



  • mgaeckler schrieb:

    Mach eine Basisklasse, bei der der verbotene Konstruktor protected ist. Dann definierst Du Dein Klassentemplate, das von Deiner Basis erbt. Deine Spezialisierung des Templates braucht dann nur den protected contructor der Basis aufrufen.

    Dann hat er das selbe Problem wieder in der abgeleiteten Klasse: wie dafür sorgen dass der Konstruktor der abgeleiteten Klasse nur dann definiert ist wenn X > 1000?

    Aber die Antwort wurde ja schon gepostet.