<?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[Klammerausdrücke in Templates]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>ich sehe in letzter Zeit des öfteren so Konstrukte wie</p>
<pre><code class="language-cpp">template&lt;typename Tlhs,
         typename Trhs,
         typename Tout&gt;
class A&lt;Tout(Tleft, Tright)&gt;
{
  /* ... */
}
</code></pre>
<p>Was genau bedeutet der Klammerausdruck in den Spitzen-Klammern und was ist der Unterschied zu Beispielsweise</p>
<pre><code class="language-cpp">template&lt;typename Tlhs,
         typename Trhs,
         typename Tout&gt;
class A&lt;Tout, Tleft, Tright&gt;
{
  /* ... */
}
</code></pre>
<p>Das einzige was mir aufgefallen ist, dass man im ersten Fall eine Klasse folgendermaßen instanziieren würde</p>
<pre><code class="language-cpp">A&lt;int(int,int)&gt; a(...);
</code></pre>
<p>und im zweiten Fall</p>
<pre><code class="language-cpp">A&lt;int,int,int&gt; a(...);
</code></pre>
<p>aber das wird nicht der einzige Unterschied sein oder?</p>
<p>Gruß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306551/klammerausdrücke-in-templates</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 11:55:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306551.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Aug 2012 04:58:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 04:58:45 GMT]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>ich sehe in letzter Zeit des öfteren so Konstrukte wie</p>
<pre><code class="language-cpp">template&lt;typename Tlhs,
         typename Trhs,
         typename Tout&gt;
class A&lt;Tout(Tleft, Tright)&gt;
{
  /* ... */
}
</code></pre>
<p>Was genau bedeutet der Klammerausdruck in den Spitzen-Klammern und was ist der Unterschied zu Beispielsweise</p>
<pre><code class="language-cpp">template&lt;typename Tlhs,
         typename Trhs,
         typename Tout&gt;
class A&lt;Tout, Tleft, Tright&gt;
{
  /* ... */
}
</code></pre>
<p>Das einzige was mir aufgefallen ist, dass man im ersten Fall eine Klasse folgendermaßen instanziieren würde</p>
<pre><code class="language-cpp">A&lt;int(int,int)&gt; a(...);
</code></pre>
<p>und im zweiten Fall</p>
<pre><code class="language-cpp">A&lt;int,int,int&gt; a(...);
</code></pre>
<p>aber das wird nicht der einzige Unterschied sein oder?</p>
<p>Gruß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237500</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Wed, 01 Aug 2012 04:58:45 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 05:23:38 GMT]]></title><description><![CDATA[<p>Hi,</p>
<pre><code class="language-cpp">Tout(Tleft, Tright)
</code></pre>
<p>ist die Signatur einer Funktion mit Rückgabewert Tout und zwei Argumenten mit Typ Tleft und Tright. Ich vermute mal, dass die Klasse dann einen Zeiger auf eine Funktion verwenden wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237502</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 01 Aug 2012 05:23:38 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 05:27:47 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Was ich immer noch nicht verstehe ist, warum dieses Konstrukt an der Stelle auftaucht, wo normal die Templateparameter übergeben werden (also zwischen den Spitzen-Klammern), ich hätte den Ausdruck &quot;Tout(Tleft, Tright)&quot; irgendwo im Klassenrumpf erwartet.</p>
<p>Gruß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237504</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Wed, 01 Aug 2012 05:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 05:32:21 GMT]]></title><description><![CDATA[<p>Ich weiß ja nicht, was die Klasse machen soll. Aber wenn sie dazu da ist, verschiedene Typen von Funktionen zu verarbeiten, also verschiedene Argumente und Rückgabewerte annehmen soll (boost::function ocer seit c++11 std::function), dann gibt es nur wenige Wege besser zu zeigen, welchen Typ die haben wollen.</p>
<p>Wenn du im Code A&lt;int(float,double)&gt; stehen hast, dann weißt du sofort: rückgabewert ist int, erstes argument der Funktion ist float, zweiter double.</p>
<p>Bei</p>
<p>A&lt;int,float,double&gt; musst du eventuell in die Dokumentation schauen um zu sehen, ob der Rückgabewert erstes oder letztes Argument ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237508</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 01 Aug 2012 05:32:21 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 05:37:41 GMT]]></title><description><![CDATA[<p>Danke, das sehe ich auch so.</p>
<p>Meine Frage war jetzt, ob der Unterschied rein in der Syntax liegt oder ob es auch semantische Unterschiede gibt zwischen</p>
<pre><code class="language-cpp">A&lt;Tout(Tleft, Tright)&gt;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">A&lt;Tout, Tleft, Tright&gt;
</code></pre>
<p>d.h. kann ich der Klassendefinition, egal welche der Beiden obigen Ansätze ich wähle, immer gleich auf Tout, Tleft und Tright zugreifen?<br />
Gruß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237509</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Wed, 01 Aug 2012 05:37:41 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 05:39:11 GMT]]></title><description><![CDATA[<p>Probier es doch aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237510</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 01 Aug 2012 05:39:11 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 06:00:59 GMT]]></title><description><![CDATA[<p>Hab es gerade erfolglos versucht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wenn ich so etwas mache wie:</p>
<pre><code class="language-cpp">template&lt;typename lhs, 
         typename rhs, 
         typename out&gt;
class A&lt;out(lhs, rhs)&gt;
{ 
  public:
    out foo(lhs x, rhs y)
    {
      return x + y;
    }
};
</code></pre>
<p>Bekomme ich den Fehler: &quot;error: ‘A’ is not a template&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237515</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Wed, 01 Aug 2012 06:00:59 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 06:06:11 GMT]]></title><description><![CDATA[<p>Weil Du so ja auch eine Spezialisierung eines Templates erstellst. Vorher muss ein Template A existieren, welches spezialisiert werden kann.</p>
<p>Und wenn Du das machst, wirst Du auch direkt feststellen, wo der Unterschied zwischen beiden Varianten ist, und zwar dass je nach Aufbau des Template nur eine der beiden Varianten überhaupt funktioniert <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>
<p>Beispiel:</p>
<pre><code class="language-cpp">// Template
template&lt; typename Func &gt;
class A { ... }; 

// Spezialisierung, wenn Func eine Funktion mit Rückgabewert T1 und zwei Parametern T2 und T3 ist
template&lt; typename T1, typename T2, typename T3 &gt;
class A&lt; T1(T2, T3) &gt; { ... };

// Fehler, da Template A keine drei Parameter hat
template&lt; typename T1, typename T2, typename T3 &gt;
class A&lt; T1, T2, T3 &gt; { ... };
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2237517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237517</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 01 Aug 2012 06:06:11 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 06:13:58 GMT]]></title><description><![CDATA[<p>Ahh so langsam blicke ich da durch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237518</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Wed, 01 Aug 2012 06:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 06:34:50 GMT]]></title><description><![CDATA[<p>A&lt;out(lhs, rhs)&gt; ist mit <em>einem</em> Typ parametrisiert, während A&lt;out, lhs, rhs&gt; mit drei Typen parametrisiert ist. Ist ein großer Unterschied, wenn du den Funktionstyp in deinem Template nur an andere Templates weiterreichen willst und nicht selbst in Rückgabe- und Argumenttypen zerlegen möchtest. So reicht dann nämlich template&lt;class Func&gt;, sonst müsstest du Überladungen für 1, 2, 3, 4, ... Argumente bereitstellen.</p>
<p>Beispiel: ich habe mal ein relativ allgeimeines Factorey-Template geschrieben, bei dem der Aufruf der Factorymethode durch einen Templateparameter festgelegt ist:</p>
<pre><code class="language-cpp">template &lt;class Signature, class DefaultCreator, class DefaultDeleter, class ManagementPolicy = detail::NoManagemetPolicy&gt;
class GenericAbstractFactory;

typedef GenericAbstractFactory&lt;int(double), /*...*/&gt; IntFactory;
int i = IntFactory::instance().create(3.14); // &lt;- int(double)

typedef GenericAbstractFactory&lt;Foo*(double, char*, int, bool), /*...*/&gt; FooFactory;
Foo* pf = FooFactory::instance().create(3.14, &quot;bar&quot;, 4711, false); // &lt;- Foo*(double, char*, int, bool)
</code></pre>
<p>Das ging <em>relativ</em> einfach (abgesehen von den create-Methoden, mangels variadic templates), dank dieses ersten Parameters, der die gesamte Funktionssignatur enthält.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237520</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 01 Aug 2012 06:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 11:57:35 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Spezialisierung, wenn Func eine Funktion mit Rückgabewert T1 und zwei Parametern T2 und T3 ist
template&lt; typename T1, typename T2, typename T3 &gt;
class A&lt; T1(T2, T3) &gt; { ... };
</code></pre>
</blockquote>
<p>Ist diese Syntax erst seit C++11 erlaubt?<br />
Ich kenne nur Zeiger auf Funktionen oder Methoden und nicht diese Syntax.</p>
<p>Was genau ist T1(T2, T3)?<br />
Womit kann ich eine solche Spezialisierung instanziieren? Mit allem was sich wie eine Funktion mit derartiger Signatur verhält? Nur mit Funktionszeigern?</p>
<p>Das ganze verwirrt mich auch noch ein wenig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237581</guid><dc:creator><![CDATA[C++11_Noob]]></dc:creator><pubDate>Wed, 01 Aug 2012 11:57:35 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 13:03:29 GMT]]></title><description><![CDATA[<p>C++11_Noob schrieb:</p>
<blockquote>
<p>LordJaxom schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Spezialisierung, wenn Func eine Funktion mit Rückgabewert T1 und zwei Parametern T2 und T3 ist
template&lt; typename T1, typename T2, typename T3 &gt;
class A&lt; T1(T2, T3) &gt; { ... };
</code></pre>
</blockquote>
<p>Ist diese Syntax erst seit C++11 erlaubt?<br />
Ich kenne nur Zeiger auf Funktionen oder Methoden und nicht diese Syntax.</p>
<p>Was genau ist T1(T2, T3)?<br />
Womit kann ich eine solche Spezialisierung instanziieren? Mit allem was sich wie eine Funktion mit derartiger Signatur verhält? Nur mit Funktionszeigern?</p>
<p>Das ganze verwirrt mich auch noch ein wenig.</p>
</blockquote>
<p>Der Typparameter für diese Spezialisierung muss ein Funktionstyp sein. Das ist keine Neuheit, so etwas gibt es bereits in C. Allerdings sieht man sie tatsächlich selten in freier Wildbahn.</p>
<pre><code class="language-cpp">typedef void func_type(int);  // deklariert den Typ func_type
func_type func;                // deklariert die Funktion func
struct foo
{
    func_type mfunc;                // deklariert die nicht-statische! Memberfunktion mfunc
};
func_type* pfunc;                   // das sieht man gelegentlich
</code></pre>
<p>Diese Syntax kann allerdings nicht dazu verwendet werden, um Funktionen zu definieren - und das ist sicher der Hauptgrund, warum diese Deklaration selten verwendet wird, da der Typ in jedem Fall bei der Definition ausgeschrieben werden muss, und typischerweise zu erwarten ist, dass Deklaration und Definition per C&amp;P austauschbar sein sollten. const/volatile-Memberfunktionen (oder in C++11 solche mit ref-Qualifikation) kann man so ebenfalls nicht deklarieren.<br />
Es gibt im Übrigen keinen speziellen Typ für nicht-statische Memberfunktionen, Zeiger auf Member(-funktionen) dagegen schon. Und das sind aber keine Zeiger (haben nur einen unglücklich gewählten Namen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237621</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 01 Aug 2012 13:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 14:08:07 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>:<br />
Meinst du mit &quot;gibt es bereits in C&quot; die Möglichkeit nen Typedef auf einen Funktionstyp zu machen?</p>
<p>Also sowas <a href="http://ideone.com/KFDhD" rel="nofollow">http://ideone.com/KFDhD</a></p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

typedef int IntFun(int, int);

IntFun foo; // Deklaration &quot;int foo(int, int)&quot;

int main()
{
    printf(&quot;%d\n&quot;, foo(1, 2));
    return 0;
}

int foo(int a, int b) { return a + b; } // Definition foo
</code></pre>
<p>Oder wo kann in C sonst noch ein Funktionstyp vorkommen? Abgesehen von den Stellen die eh jeder kennt, also normale Funktions-Deklaration oder -Definition?<br />
Funktionszeigertypen in Casts ja, aber mit Funktionstypen wällt mir jetzt nix ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237644</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 01 Aug 2012 14:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 14:10:40 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>:<br />
Meinst du mit &quot;gibt es bereits in C&quot; die Möglichkeit nen Typedef auf einen Funktionstyp zu machen?</p>
</blockquote>
<p>Ich glaube er meint die Möglichkeit, diesen Typ zu bilden und aufzuschreiben. Dass man ihn aufgrund anderer Zwänge nur eingeschränkt verwenden kann ist dabei doch egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237648</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 01 Aug 2012 14:10:40 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 14:41:56 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>:<br />
Meinst du mit &quot;gibt es bereits in C&quot; die Möglichkeit nen Typedef auf einen Funktionstyp zu machen?</p>
</blockquote>
<p>Ich glaube er meint die Möglichkeit, diesen Typ zu bilden und aufzuschreiben. Dass man ihn aufgrund anderer Zwänge nur eingeschränkt verwenden kann ist dabei doch egal.</p>
</blockquote>
<p>Ich kenne aber in C eigentlich keine Stelle wo man einen Funktionstyp schreiben könnte ohne dem Kind einen Namen zu verpassen (wie eben bei Typedef).</p>
<p>Daher meine Frage: wo kann man in C einen Funktionstyp in dieser Form schreiben?</p>
<p>Denn die Antwort kann mMn. nicht lauten &quot;konkret nirgends, aber eigentlich würde es gehen&quot; <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/2237670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237670</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 01 Aug 2012 14:41:56 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 14:49:34 GMT]]></title><description><![CDATA[<p>*Murks*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237673</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 01 Aug 2012 14:49:34 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 15:17:06 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Bashar schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>:<br />
Meinst du mit &quot;gibt es bereits in C&quot; die Möglichkeit nen Typedef auf einen Funktionstyp zu machen?</p>
</blockquote>
<p>Ich glaube er meint die Möglichkeit, diesen Typ zu bilden und aufzuschreiben. Dass man ihn aufgrund anderer Zwänge nur eingeschränkt verwenden kann ist dabei doch egal.</p>
</blockquote>
<p>Ich kenne aber in C eigentlich keine Stelle wo man einen Funktionstyp schreiben könnte ohne dem Kind einen Namen zu verpassen (wie eben bei Typedef).</p>
<p>Daher meine Frage: wo kann man in C einen Funktionstyp in dieser Form schreiben?</p>
<p>Denn die Antwort kann mMn. nicht lauten &quot;konkret nirgends, aber eigentlich würde es gehen&quot; <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>
</blockquote>
<p>Das ist doch nicht anders als etwa mit arrays. Würdest du behaupten, es gäbe keinen Arraytyp in C?<br />
Eine Deklaration führt immer einen Namen ein (Grenzfälle wie anonyme unions mals ausgenommen, die allerdings nicht leer sein können und so indirekt einen Bezeichner einführen).<br />
In Ausdrücken kommen im Grunde nur Casts in Frage.<br />
Als Teil einer Deklaration dürfen Funktionstypen bei Funktionsparametern auftreten (ebenso wie Arrays), werden dort allerdings automatisch als Zeiger interpretiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237687</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 01 Aug 2012 15:17:06 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 15:28:55 GMT]]></title><description><![CDATA[<p>Einen Arraytyp kann man immerhin noch als Argument von sizeof verwenden, einen Funktionstyp nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237691</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 01 Aug 2012 15:28:55 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 16:17:04 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Einen Arraytyp kann man immerhin noch als Argument von sizeof verwenden, einen Funktionstyp nicht.</p>
</blockquote>
<p>ok, hatte ich übersehen.<br />
Dann bleibt als einziger Fall eben die Deklaration eines Funktionsparameters übrig, z.B.</p>
<pre><code class="language-cpp">void f(void());
</code></pre>
<p>Diesen Fall kennen wir aus C++ ja zur Genüge, leider... <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/2237715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237715</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 01 Aug 2012 16:17:04 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 17:32:08 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void f(void());
</code></pre>
<p>Diesen Fall kennen wir aus C++ ja zur Genüge, leider... <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>
</blockquote>
<p>Meinst du die Verwendung dieser Deklarationssyntax fuer Funktionsparameter? Ich nehme immer <code>std::function</code> .</p>
<p>Oder was meinst du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237737</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 01 Aug 2012 17:32:08 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 19:28:59 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void f(void());
</code></pre>
<p>Diesen Fall kennen wir aus C++ ja zur Genüge, leider... <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>
</blockquote>
<p>Meinst du die Verwendung dieser Deklarationssyntax fuer Funktionsparameter? Ich nehme immer <code>std::function</code> .</p>
<p>Oder was meinst du?</p>
</blockquote>
<pre><code class="language-cpp">T x(U());
</code></pre>
<p>ist eine funktionsdeklaration, und nicht die Initialisierung eines Objektes mit einem default-initialisierten anderen Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237759</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 01 Aug 2012 19:28:59 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Wed, 01 Aug 2012 22:03:47 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void f(void());
</code></pre>
<p>Diesen Fall kennen wir aus C++ ja zur Genüge, leider... <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>
</blockquote>
<p>Meinst du die Verwendung dieser Deklarationssyntax fuer Funktionsparameter? Ich nehme immer <code>std::function</code> .</p>
<p>Oder was meinst du?</p>
</blockquote>
<pre><code class="language-cpp">T x(U());
</code></pre>
<p>ist eine funktionsdeklaration, und nicht die Initialisierung eines Objektes mit einem default-initialisierten anderen Objekt.</p>
</blockquote>
<p>Hey, wusste ich gar nicht! Danke!<br />
Andererseits wuerde ich hier sowieso copy-initialisation vorziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237773</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 01 Aug 2012 22:03:47 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Thu, 02 Aug 2012 07:55:07 GMT]]></title><description><![CDATA[<p>Danke für die Antworten. Habe aber immer noch Verständnisschwierigkeiten.</p>
<p>Im folgenden Beispiel möchte ich einen Wrapper für alle Arten von Funktionen, die keinen Rückgabewert und einen int Parameter haben (Nicht so sinnvoll aber das ist nicht der Punkt):</p>
<pre><code class="language-cpp">template&lt;class Function&gt;
class Wrapper
{
	Function function;

public:
	Wrapper(Function f)
		: function(f) {}

	void bar()
	{
		function(99);
	}
};

void callback(int i)
{
	cout&lt;&lt;&quot;normal function &quot;&lt;&lt;i&lt;&lt;endl;
}

class Functor
{
public:
	Functor(){}
	void operator()(int i)
	{
		cout&lt;&lt;&quot;Functor &quot;&lt;&lt;i&lt;&lt;endl;
	}
};

int main()
{
	//1. Verwendung mit Funktionzeiger: Funktioniert
	Wrapper&lt;void(*)(int)&gt; w1(callback);
	w1.bar();

	//2. Verwendung mit Objekt das einen Operator() überlädt: Funktioniert
	Wrapper&lt;Functor&gt; w2( (Functor()) );
	w2.bar();

	//3. Nun kommen wir zur Syntax um die es in diesem Thread geht: Schlägt fehl &lt;-------------------
	Wrapper&lt;void(int)&gt; w3(callback);
	w3.bar();
}
</code></pre>
<p>Der dritte Fall funktioniert in dieser Form nicht, was imho an der Initialisierungsliste von Wrapper liegt. Eine Initialisierung oder auch Zuweisung ist in dieser Form nunmal nicht möglich.<br />
Abhilfe schafft nun eine Spezialisierung:</p>
<pre><code class="language-cpp">template&lt;class in, class out&gt;
class Wrapper&lt;in(out)&gt;
{
	typedef in(*ptr)(out);
	ptr foo;

public:
	Wrapper(ptr f)
		: foo(f) {}

	void bar()
	{
		foo(101);
	}
};
</code></pre>
<p>Aber warum genau sollte ich sowas wollen? Macht das überhaupt Sinn?<br />
Diese Mehrarbeit der Spezialisierung kann man doch Vermeiden, in dem man wie in Fall 1 einen Zeigertyp bei der Instanziierung verwedet.</p>
<p>Mit Hilfe von std::function könnte man auch auf die Spezialisierung verzichten und den ursprünglichen Wrapper wie folgt verwenden:</p>
<pre><code class="language-cpp">std::function&lt;void(int)&gt; func(callback);
Wrapper&lt;std::function&lt;void(int)&gt;&gt; w3(func);
w3.bar();
</code></pre>
<p>Wieder die Frage: Warum sollte ich sowas wollen? Hat das Vorteile gegenüber Fall 1 (Zeiger auf Funktion) ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237832</guid><dc:creator><![CDATA[C++11_Noob]]></dc:creator><pubDate>Thu, 02 Aug 2012 07:55:07 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Thu, 02 Aug 2012 08:38:23 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Function function;
</code></pre>
<p>Wenn Function ein Funktionstyp ist, dann ist das eine Funktionsdeklaration.</p>
<p>Da nur diese Deklaration problematisch ist, wäre es angebracht, an dieser Stelle mit Indirektion zu arbeiten, statt gleich das gesamte Template zu spezialiseren. std::decay bietet den hier benötigten Mechanismus.</p>
<pre><code class="language-cpp">typename std::decay&lt;Function&gt;::type function;
</code></pre>
<blockquote>
<p>Aber warum genau sollte ich sowas wollen?</p>
</blockquote>
<p>Da das ein simples Beispiel ist, eine kaum beantwortbare Frage.<br />
std::function ist allerdings ein erheblich komplexeres und flexibleres Gebilde, weil hier der Templateparameter nur vorgibt, wie das resultierende Funktionsobjekt aufgerufen werden kann, und was dabei zurückgegeben wird. Mit was für einer Art Entität dieses intialisiert wird, ist damit noch nicht vorgegeben.<br />
Dafür kostet diese Flexibiltät natürlich auch etwas (Minimum ein zusätzlicher Zeiger und eine zusätzliche Indirektion beim Aufruf des Funktors).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237845</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 02 Aug 2012 08:38:23 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Thu, 02 Aug 2012 11:04:20 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Andererseits wuerde ich hier sowieso copy-initialisation vorziehen.</p>
</blockquote>
<p>Bei einer vernünftig designed Klasse ist der entsprechende Konstruktor aber möglicherweise explicit, dann geht es in C++03 nur mit Klammern. In C++11 kann man auch geschweifte Klammern einsetzen bei dem defaultkonstruierten Objekt, macht man das nur bei der anderen Klasse erwischt man evtl. einen initializer_list-Konstruktor, den man nicht aufrufen will.</p>
<p>Das ist jedenfalls einer der wenigen Fehler, bei denen ich bei der Fehlersuche beim ersten mal lange gebraucht und geflucht habe (trotz des abstrakten Wissens darum). Die Fehlermeldung tritt nämlich erst später auf und scheint völlig sinnlos zu sein. Die Lösung ist recht einfach: eine zusätzliche Klammer um das Argument, siehe auch C++11_Noobs Post, der 2. Fall). Typdeklarationen haben nie eine sie ganz umschließende Klammer (andernfalls wäre die Grammatik mehrdeutig, man denke an sizeof(T) oder (T)x ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237884</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 02 Aug 2012 11:04:20 GMT</pubDate></item><item><title><![CDATA[Reply to Klammerausdrücke in Templates on Fri, 03 Aug 2012 17:11:58 GMT]]></title><description><![CDATA[<p>Weil's gerade passt:</p>
<p>Wie kann ich es denn umsetzen create dynamisch richtig aufzurufen? Ich habe gerade eine Methode, die eine freie Funktion erwartet, deren Parameter unterschiedlich sein können. Ich würde die Funktion natürlich gerne etwa so aufrufen:</p>
<pre><code class="language-cpp">void foo(int a, int b)
{
// ...
}

void foo2(const std::string&amp; a, Class&amp; someRef)
{
// ...
}

// Aufrufe
method(foo, 10, 20);
method(foo2, &quot;hallo&quot;, classInstance);
</code></pre>
<p>Hilft mir da boost::function weiter? Irgendwas Spezielles, wonach ich suchen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2238441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2238441</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 03 Aug 2012 17:11:58 GMT</pubDate></item></channel></rss>