<?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[template in Abhängigkeit der Anzahl der Argumente?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wollte mal fragen ob sowas möglich ist:</p>
<pre><code>template &lt;typename func&gt;
void foo(func f)
{
	std::vector&lt;int&gt; v(3);

	if (/* func ist Funktion vom Typ f1 bzw. nimmt 2 Argumente */) {
		f(std::begin(v), std::end(v));
	}
	else /* func ist Funktion vom Typ f2 bzw. nimmt 1 Argument */ { 
		f(v);
	}
}

void f1(std::vector&lt;int&gt;::iterator begin_, std::vector&lt;int&gt;::iterator end_)
{
	// mach irgendwas
}

void f2(std::vector&lt;int&gt; const &amp;vector_)
{
	// mach irgendwas
}

int main()
{
	foo(f1);
	foo(f2);
}
</code></pre>
<p>Ziel wäre dass der Benutzer von foo seine Funktionen entweder wie f1 oder wie f2 deklarieren kann, also das template davon abhängt ob die Funktion 1 Argument oder 2 nimmt.</p>
<p>Wie man die Anzahl der Funktionsparameter zur Compilezeit mittels templates zählen kann weiß ich schon, aber wie kann man sich dann das nötige if-Konstrukt bauen? Geht das überhaupt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327834/template-in-abhängigkeit-der-anzahl-der-argumente</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 17:45:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327834.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Sep 2014 20:18:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template in Abhängigkeit der Anzahl der Argumente? on Sat, 06 Sep 2014 20:18:39 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wollte mal fragen ob sowas möglich ist:</p>
<pre><code>template &lt;typename func&gt;
void foo(func f)
{
	std::vector&lt;int&gt; v(3);

	if (/* func ist Funktion vom Typ f1 bzw. nimmt 2 Argumente */) {
		f(std::begin(v), std::end(v));
	}
	else /* func ist Funktion vom Typ f2 bzw. nimmt 1 Argument */ { 
		f(v);
	}
}

void f1(std::vector&lt;int&gt;::iterator begin_, std::vector&lt;int&gt;::iterator end_)
{
	// mach irgendwas
}

void f2(std::vector&lt;int&gt; const &amp;vector_)
{
	// mach irgendwas
}

int main()
{
	foo(f1);
	foo(f2);
}
</code></pre>
<p>Ziel wäre dass der Benutzer von foo seine Funktionen entweder wie f1 oder wie f2 deklarieren kann, also das template davon abhängt ob die Funktion 1 Argument oder 2 nimmt.</p>
<p>Wie man die Anzahl der Funktionsparameter zur Compilezeit mittels templates zählen kann weiß ich schon, aber wie kann man sich dann das nötige if-Konstrukt bauen? Geht das überhaupt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416398</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 06 Sep 2014 20:18:39 GMT</pubDate></item><item><title><![CDATA[Reply to template in Abhängigkeit der Anzahl der Argumente? on Sat, 06 Sep 2014 20:27:44 GMT]]></title><description><![CDATA[<pre><code>template &lt;typename func&gt;
auto foo_call(std::vector&lt;int&gt; const&amp; v, func f) -&gt; decltype(f(v)) {return f(v);}

template &lt;typename func&gt;
auto foo_call(std::vector&lt;int&gt; const&amp; v, func f) -&gt; decltype(f(v.begin(), v.end())) {return f(v.begin(), v.end());}

template &lt;typename func&gt;
void foo(func f)
{
    std::vector&lt;int&gt; v(3);
    foo_call(v, f);
}
</code></pre>
<p>ggf. mit einem <code>AUTO_RETURN</code> -Makro verkürzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416399</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 06 Sep 2014 20:27:44 GMT</pubDate></item><item><title><![CDATA[Reply to template in Abhängigkeit der Anzahl der Argumente? on Sat, 06 Sep 2014 20:49:24 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Arcoth schrieb:</p>
<blockquote>
<pre><code>template &lt;typename func&gt;
auto foo_call(std::vector&lt;int&gt; const&amp; v, func f) -&gt; decltype(f(v)) {return f(v);}

template &lt;typename func&gt;
auto foo_call(std::vector&lt;int&gt; const&amp; v, func f) -&gt; decltype(f(v.begin(), v.end())) {return f(v.begin(), v.end());}

template &lt;typename func&gt;
void foo(func f)
{
    std::vector&lt;int&gt; v(3);
    foo_call(v, f);
}
</code></pre>
<p>ggf. mit einem <code>AUTO_RETURN</code> -Makro verkürzen.</p>
</blockquote>
<p>wie soll das funktionieren, die Funktionen unterscheiden sich ja nur hinsichtlich des Rückgabetypes, welcher ja nicht für die Überladung berücksichtigt wird.</p>
<p>Auf jeden Fall erhalte ich mit diesem Code einen Fehler:</p>
<pre><code>template &lt;typename func&gt;
auto foo_call(std::vector&lt;int&gt; const&amp; v, func f) -&gt; decltype(f(v)) { return f(v); }

template &lt;typename func&gt;
auto foo_call(std::vector&lt;int&gt; const&amp; v, func f) -&gt; decltype(f(v.begin(), v.end())) { return f(v.begin(), v.end()); }

template &lt;typename func&gt;
void foo(func f)
{
	std::vector&lt;int&gt; v(3);
	foo_call(v, f);
}

int f1(std::vector&lt;int&gt; const &amp;v_) { std::cout &lt;&lt; &quot;f1\n&quot;; }
int f2(std::vector&lt;int&gt;::iterator begin_, std::vector&lt;int&gt;::iterator end_) { std::cout &lt;&lt; &quot;f2\n&quot;; }

int main()
{
	foo(f1); // Fehler, gleiches mit f2
}
</code></pre>
<p>error C2995: &quot;unknown-type foo_call(const std::vector&lt;int,std::allocator&lt;_Ty&gt;&gt; &amp;,func)&quot;: Funktionsvorlage wurde bereits definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416403</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 06 Sep 2014 20:49:24 GMT</pubDate></item><item><title><![CDATA[Reply to template in Abhängigkeit der Anzahl der Argumente? on Sat, 06 Sep 2014 22:58:05 GMT]]></title><description><![CDATA[<p>Ja, der MSVC hat das noch nicht so richtig raus. In C++03 könnte man das etwa so machen:</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;

// Dummy-Typ für SFINAE. 
template&lt;std::size_t&gt; struct dummy_type { };

// Syntaxzucker. Darf nicht wirklich verwendet werden, aber das Zeug in sizeof-Ausdrücken wird halt
// nicht ausgewertet, und es sieht so etwas lesbarer aus als überall direkt die *static_cast&lt;T*&gt;(0)
// zu haben.
template&lt;typename T&gt; T &amp;dummy_obj() { return *static_cast&lt;T*&gt;(0); }

// Hier SFINAE-Trick: Wenn f(v) nicht kompilierbar ist, ist es auch dummy_obj&lt;func&gt;()(dummy_blablabla) nicht,
// und dann kann dummy_type&lt;sizeof(blabla)&gt; nicht substituiert werden. Damit fällt die Spezialisierung aus dem
// Lookup und wird nicht weiter beachtet.
template &lt;typename func&gt;
void foo_call(std::vector&lt;int&gt; const&amp; v, func f,
              dummy_type&lt;sizeof(dummy_obj&lt;func&gt;()(dummy_obj&lt;std::vector&lt;int&gt; const&gt;()),0)&gt;* = 0)
{
  f(v);
}

// Hier das selbe in grün.
template &lt;typename func&gt;
void foo_call(std::vector&lt;int&gt; const&amp; v, func f,
              dummy_type&lt;sizeof(dummy_obj&lt;func&gt;()(dummy_obj&lt;std::vector&lt;int&gt;::const_iterator&gt;(),
                                                  dummy_obj&lt;std::vector&lt;int&gt;::const_iterator&gt;()),0)&gt;* = 0)
{
  f(v.begin(), v.end());
}

template &lt;typename func&gt;
void foo(func f)
{
    std::vector&lt;int&gt; v(3);
    foo_call(v, f);
}

void f1(std::vector&lt;int&gt; const &amp;v_) { std::cout &lt;&lt; &quot;f1\n&quot;; }
void f2(std::vector&lt;int&gt;::const_iterator begin_, std::vector&lt;int&gt;::const_iterator end_) { std::cout &lt;&lt; &quot;f2\n&quot;; }

int main()
{
    foo(f1);
    foo(f2);
}
</code></pre>
<p>In dieser Form führt das noch zu Fehlern, wenn ein Funktionsobjekt beide Signaturen unterstützt. Das ließe sich ggf. mit enable_if auflösen, ist aber dann mehr Aufwand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416412</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 06 Sep 2014 22:58:05 GMT</pubDate></item><item><title><![CDATA[Reply to template in Abhängigkeit der Anzahl der Argumente? on Sun, 07 Sep 2014 04:22:19 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>Arcoth schrieb:</p>
<blockquote>
<pre><code>template &lt;typename func&gt;
auto foo_call(std::vector&lt;int&gt; const&amp; v, func f) -&gt; decltype(f(v)) {return f(v);}

template &lt;typename func&gt;
auto foo_call(std::vector&lt;int&gt; const&amp; v, func f) -&gt; decltype(f(v.begin(), v.end())) {return f(v.begin(), v.end());}

template &lt;typename func&gt;
void foo(func f)
{
    std::vector&lt;int&gt; v(3);
    foo_call(v, f);
}
</code></pre>
<p>ggf. mit einem <code>AUTO_RETURN</code> -Makro verkürzen.</p>
</blockquote>
<p>wie soll das funktionieren, die Funktionen unterscheiden sich ja nur hinsichtlich des Rückgabetypes, welcher ja nicht für die Überladung berücksichtigt wird.</p>
</blockquote>
<p>Die jeweils andere Funktion sollte durch SFINAE aus der overload resultion gezogen werden. Bitte schlagt mich nicht, wenn das nicht stimmt, ist so früh <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2416419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416419</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Sun, 07 Sep 2014 04:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to template in Abhängigkeit der Anzahl der Argumente? on Sun, 07 Sep 2014 12:32:45 GMT]]></title><description><![CDATA[<p>Ok, dann werd ich das mal so ausprobieren. Danke auf jeden Fall für die Antworten <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/2416444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2416444</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 07 Sep 2014 12:32:45 GMT</pubDate></item></channel></rss>