<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Konstruktor und Attribute mit std::enable_if beeinflussen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ist es möglich, mit std::enable_if Klassenattribute &quot;Aus bzw Einschalten&quot; und den dementsprechenden Konstruktor zu aktivieren?</p>
<p>Im folgenden &quot;sinnbefreiten&quot; Beispiel will ich zeigen was mir vorschwebt.<br />
Vorweg: mir ist bewusst, dass ich dies mit mehreren &quot;CalcAlgo&quot; Klassen leicht hinbekommen würde. Mich interessiert aber ob so etwas mit enable_if bzw was anderem aus den Type Traits machbar ist.</p>
<pre><code>#include &lt;array&gt;

template &lt;typename T&gt;
class IAlgo {
public:
	virtual ~IAlgo(){}
	virtual const T calc(T val) = 0;
};

template &lt;typename T&gt;
class Algo : public IAlgo&lt;T&gt; {
public:
	virtual ~Algo(){}
	virtual const T calc(T val) override final {return val*val;}
};

template &lt;typename T&gt;
class NoneAlgo : public IAlgo&lt;T&gt; {
public:
	virtual ~NoneAlgo(){}
	virtual const T calc(T val) override final {return val;}
};

template &lt;typename T, unsigned int algos = 1&gt;
class CalcAlgo {
private:
	/*
	 * Wie kann ich dieses Attribut deaktivieren wenn algos != 1 ist?
	 * Ist dies mit std::enable_if möglich?
	 */
	IAlgo&lt;T&gt; &amp;algo;

	/*
	 * Wie kann ich dieses Attribut deaktivieren wenn algos &lt; 2 ist?
	 * Ist dies mit std::enable_if möglich?
	 */
	//std::array&lt;IAlgo&lt;T&gt;,algos&gt; &amp;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, &quot;Der template Parameter algos muss 0 sein!&quot;);
	}
	 */

	CalcAlgo(IAlgo&lt;T&gt; &amp;algo) : algo{algo} {
		static_assert(algos==1, &quot;Der template Parameter algos muss 1 sein!&quot;);
	}

	/*
	CalcAlgo(std::array&lt;IAlgo&lt;T&gt;,algos&gt; &amp;algos) : algos{algos} {
		static_assert(algos&gt;1, &quot;Der template Parameter algos muss größer 1 sein!&quot;);
	}
	 */

	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 &gt; 1) {
			for (auto algo : algoArray) {
				retVal += algo.calc();
			}
		}
		*/
		else {
			retVal = val;
		}
		return retVal;
	}
};

int main() {
	Algo&lt;float&gt; algo{};
	NoneAlgo&lt;float&gt; noneAlgo{};

	CalcAlgo&lt;float, 1&gt; calcWith{algo};
	CalcAlgo&lt;float, 0&gt; 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&lt;float, 0&gt; calcNone{}; //Dies funktioniert nicht, da das Attribut CalcAlgo::algo bzw das array initializiert werden muss.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/339969/konstruktor-und-attribute-mit-std-enable_if-beeinflussen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 13:55:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339969.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Oct 2016 08:11:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor und Attribute mit std::enable_if beeinflussen? on Tue, 11 Oct 2016 08:11:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ist es möglich, mit std::enable_if Klassenattribute &quot;Aus bzw Einschalten&quot; und den dementsprechenden Konstruktor zu aktivieren?</p>
<p>Im folgenden &quot;sinnbefreiten&quot; Beispiel will ich zeigen was mir vorschwebt.<br />
Vorweg: mir ist bewusst, dass ich dies mit mehreren &quot;CalcAlgo&quot; Klassen leicht hinbekommen würde. Mich interessiert aber ob so etwas mit enable_if bzw was anderem aus den Type Traits machbar ist.</p>
<pre><code>#include &lt;array&gt;

template &lt;typename T&gt;
class IAlgo {
public:
	virtual ~IAlgo(){}
	virtual const T calc(T val) = 0;
};

template &lt;typename T&gt;
class Algo : public IAlgo&lt;T&gt; {
public:
	virtual ~Algo(){}
	virtual const T calc(T val) override final {return val*val;}
};

template &lt;typename T&gt;
class NoneAlgo : public IAlgo&lt;T&gt; {
public:
	virtual ~NoneAlgo(){}
	virtual const T calc(T val) override final {return val;}
};

template &lt;typename T, unsigned int algos = 1&gt;
class CalcAlgo {
private:
	/*
	 * Wie kann ich dieses Attribut deaktivieren wenn algos != 1 ist?
	 * Ist dies mit std::enable_if möglich?
	 */
	IAlgo&lt;T&gt; &amp;algo;

	/*
	 * Wie kann ich dieses Attribut deaktivieren wenn algos &lt; 2 ist?
	 * Ist dies mit std::enable_if möglich?
	 */
	//std::array&lt;IAlgo&lt;T&gt;,algos&gt; &amp;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, &quot;Der template Parameter algos muss 0 sein!&quot;);
	}
	 */

	CalcAlgo(IAlgo&lt;T&gt; &amp;algo) : algo{algo} {
		static_assert(algos==1, &quot;Der template Parameter algos muss 1 sein!&quot;);
	}

	/*
	CalcAlgo(std::array&lt;IAlgo&lt;T&gt;,algos&gt; &amp;algos) : algos{algos} {
		static_assert(algos&gt;1, &quot;Der template Parameter algos muss größer 1 sein!&quot;);
	}
	 */

	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 &gt; 1) {
			for (auto algo : algoArray) {
				retVal += algo.calc();
			}
		}
		*/
		else {
			retVal = val;
		}
		return retVal;
	}
};

int main() {
	Algo&lt;float&gt; algo{};
	NoneAlgo&lt;float&gt; noneAlgo{};

	CalcAlgo&lt;float, 1&gt; calcWith{algo};
	CalcAlgo&lt;float, 0&gt; 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&lt;float, 0&gt; calcNone{}; //Dies funktioniert nicht, da das Attribut CalcAlgo::algo bzw das array initializiert werden muss.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2511183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511183</guid><dc:creator><![CDATA[godi]]></dc:creator><pubDate>Tue, 11 Oct 2016 08:11:10 GMT</pubDate></item></channel></rss>