<?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[Funktionsaufruf abhängig vom typedef eines Parameters]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Template-Funktion, die einen Parameter mit einem bestimmten typedef hat. In dieser Funktion will ich dann je nach Typ des typedefs (eigentlich nur für bestimmte Ausnahmen) den Funktionsaufruf differenzieren.</p>
<p>als nach folgendem Schema:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
class Foo{
public:
	typedef T type;
};

template&lt;typename T&gt;
class Function{
public:
	void operator()(){
		std::cout &lt;&lt; &quot;undefined&quot; &lt;&lt; std::endl;
	}
};

template&lt;&gt;
class Function&lt;int&gt;{
public:
	void operator()(){
		std::cout &lt;&lt; &quot;int&quot; &lt;&lt; std::endl;
	}
};

template&lt;&gt;
class Function&lt;void&gt;{
public:
	void operator()(){
		std::cout &lt;&lt; &quot;void&quot; &lt;&lt; std::endl;
	}
};

template&lt;typename T&gt;
void test(const T&amp; t){
	typedef typename T::type type;
	Function&lt;type&gt; func;
	func();
	// EDIT: Hier natürlich noch einiges anderes...
}

int main(){
	Foo&lt;int&gt; foo1;
	Foo&lt;void&gt; foo2;
	Foo&lt;bool&gt; foo3;
	test(foo1);
	test(foo2);
	test(foo3);
}
</code></pre>
<blockquote>
<p>int<br />
void<br />
undefined</p>
</blockquote>
<p>Der Parameter muss allerdings nicht zwangsläufig ein Foo&lt;...&gt; sein, sondern kann auch ein Bar&lt;...&gt; sein.<br />
Geht es ohne Verwendung eines Klassen-Template als Hifsmittel?<br />
Eigentlich bin ich davon überzeugt, dass es nicht anders geht, aber bevor ich zukünftig einen zu umständlichen Weg verwende, wollte ich hier mal nachfragen.</p>
<p>Gruß,<br />
XSpille</p>
<p>EDIT: von mir aus auch eine C++0x-Lösung</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290594/funktionsaufruf-abhängig-vom-typedef-eines-parameters</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 10:48:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290594.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 29 Jul 2011 14:31:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsaufruf abhängig vom typedef eines Parameters on Fri, 29 Jul 2011 14:38:19 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Template-Funktion, die einen Parameter mit einem bestimmten typedef hat. In dieser Funktion will ich dann je nach Typ des typedefs (eigentlich nur für bestimmte Ausnahmen) den Funktionsaufruf differenzieren.</p>
<p>als nach folgendem Schema:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
class Foo{
public:
	typedef T type;
};

template&lt;typename T&gt;
class Function{
public:
	void operator()(){
		std::cout &lt;&lt; &quot;undefined&quot; &lt;&lt; std::endl;
	}
};

template&lt;&gt;
class Function&lt;int&gt;{
public:
	void operator()(){
		std::cout &lt;&lt; &quot;int&quot; &lt;&lt; std::endl;
	}
};

template&lt;&gt;
class Function&lt;void&gt;{
public:
	void operator()(){
		std::cout &lt;&lt; &quot;void&quot; &lt;&lt; std::endl;
	}
};

template&lt;typename T&gt;
void test(const T&amp; t){
	typedef typename T::type type;
	Function&lt;type&gt; func;
	func();
	// EDIT: Hier natürlich noch einiges anderes...
}

int main(){
	Foo&lt;int&gt; foo1;
	Foo&lt;void&gt; foo2;
	Foo&lt;bool&gt; foo3;
	test(foo1);
	test(foo2);
	test(foo3);
}
</code></pre>
<blockquote>
<p>int<br />
void<br />
undefined</p>
</blockquote>
<p>Der Parameter muss allerdings nicht zwangsläufig ein Foo&lt;...&gt; sein, sondern kann auch ein Bar&lt;...&gt; sein.<br />
Geht es ohne Verwendung eines Klassen-Template als Hifsmittel?<br />
Eigentlich bin ich davon überzeugt, dass es nicht anders geht, aber bevor ich zukünftig einen zu umständlichen Weg verwende, wollte ich hier mal nachfragen.</p>
<p>Gruß,<br />
XSpille</p>
<p>EDIT: von mir aus auch eine C++0x-Lösung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099512</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Fri, 29 Jul 2011 14:38:19 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufruf abhängig vom typedef eines Parameters on Fri, 29 Jul 2011 15:28:01 GMT]]></title><description><![CDATA[<p>In deinem Fall könntest du einfach ein Funktionstemplate schreiben und spezialisieren. Allerdings wird das schnell frickelig und ist in den Möglichkeiten begrenzt. Zum Beispiel ist keine partielle Spezialisierung möglich, und die Regeln zur Überladungsauflösung sind nicht intuitiv. Ich bevorzuge deshalb immer Überladung.</p>
<p>Alexandrescu erklärt in seinem Buch einen genialen Trick:</p>
<pre><code class="language-cpp">// In deiner Metaprogrammierungs-Toolbox
template &lt;typename T&gt;
struct Type2Type {};
</code></pre>
<p>Angewandt sieht das dann so aus:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void Func(Type2Type&lt;T&gt;)
{
    std::cout &lt;&lt; &quot;undefined&quot; &lt;&lt; std::endl;
}

void Func(Type2Type&lt;int&gt;)
{
    std::cout &lt;&lt; &quot;int&quot; &lt;&lt; std::endl;
}

void Func(Type2Type&lt;void&gt;)
{
    std::cout &lt;&lt; &quot;void&quot; &lt;&lt; std::endl;
}

template&lt;typename T&gt;
void Test(const T&amp; t)
{
    Func(Type2Type&lt;typename T::type&gt;());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2099543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099543</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 29 Jul 2011 15:28:01 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufruf abhängig vom typedef eines Parameters on Sat, 30 Jul 2011 13:16:33 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>I like <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099817</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 30 Jul 2011 13:16:33 GMT</pubDate></item></channel></rss>