Konstruktor und Attribute mit std::enable_if beeinflussen?



  • Hallo,

    ist es möglich, mit std::enable_if Klassenattribute "Aus bzw Einschalten" und den dementsprechenden Konstruktor zu aktivieren?

    Im folgenden "sinnbefreiten" Beispiel will ich zeigen was mir vorschwebt.
    Vorweg: mir ist bewusst, dass ich dies mit mehreren "CalcAlgo" Klassen leicht hinbekommen würde. Mich interessiert aber ob so etwas mit enable_if bzw was anderem aus den Type Traits machbar ist.

    #include <array>
    
    template <typename T>
    class IAlgo {
    public:
    	virtual ~IAlgo(){}
    	virtual const T calc(T val) = 0;
    };
    
    template <typename T>
    class Algo : public IAlgo<T> {
    public:
    	virtual ~Algo(){}
    	virtual const T calc(T val) override final {return val*val;}
    };
    
    template <typename T>
    class NoneAlgo : public IAlgo<T> {
    public:
    	virtual ~NoneAlgo(){}
    	virtual const T calc(T val) override final {return val;}
    };
    
    template <typename T, unsigned int algos = 1>
    class CalcAlgo {
    private:
    	/*
    	 * Wie kann ich dieses Attribut deaktivieren wenn algos != 1 ist?
    	 * Ist dies mit std::enable_if möglich?
    	 */
    	IAlgo<T> &algo;
    
    	/*
    	 * Wie kann ich dieses Attribut deaktivieren wenn algos < 2 ist?
    	 * Ist dies mit std::enable_if möglich?
    	 */
    	//std::array<IAlgo<T>,algos> &algoArray;
    
    public:
    	/*
    	 * Wie kann ich diesen Konstruktor verwenden wenn enableAlgo == false ist?
    	 * Ist dies mit std::enable_if möglich?
    	CalcAlgo() {
    		static_assert(algos==0, "Der template Parameter algos muss 0 sein!");
    	}
    	 */
    
    	CalcAlgo(IAlgo<T> &algo) : algo{algo} {
    		static_assert(algos==1, "Der template Parameter algos muss 1 sein!");
    	}
    
    	/*
    	CalcAlgo(std::array<IAlgo<T>,algos> &algos) : algos{algos} {
    		static_assert(algos>1, "Der template Parameter algos muss größer 1 sein!");
    	}
    	 */
    
    	virtual ~CalcAlgo(){}
    
    	const T calc(T val) {
    		T retVal{0};
    
    		if (algos == 1) {
    			retVal = algo.calc();
    		}
    		/* Kommentar kann entfernt werden wenn sich das Array aktiviern/deaktivieren lässt.
    		else if (algos > 1) {
    			for (auto algo : algoArray) {
    				retVal += algo.calc();
    			}
    		}
    		*/
    		else {
    			retVal = val;
    		}
    		return retVal;
    	}
    };
    
    int main() {
    	Algo<float> algo{};
    	NoneAlgo<float> noneAlgo{};
    
    	CalcAlgo<float, 1> calcWith{algo};
    	CalcAlgo<float, 0> calcWithNone{noneAlgo}; //Dies funktioniert theoretisch, (vorrausgesetzt das array ist auskommentiert) ist aber sinnlos den noneAlgo zu übergeben. Deshalb wurde dies mit static_assert unterbunden.
    	//CalcAlgo<float, 0> calcNone{}; //Dies funktioniert nicht, da das Attribut CalcAlgo::algo bzw das array initializiert werden muss.
    }
    

Anmelden zum Antworten