<?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[decltype(T::operator()()) für Klassen-Template-Parameter T]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte einen typedef innerhalb einer Klasse definieren, der abhängig ist von dem Rückgabe-Typ einer Funktion, die als Template-Parameter an die Klasse übergeben wird. (EDIT: Klar ist die Funktion nicht selbst der Template-Parameter)</p>
<p>Also ich meine etwa so etwas:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct Foo{

	typedef decltype(_t()) type;
	//typedef decltype(T::operator()()) type;
	Foo(T t) : _t(t){}

	type operator()(){ return _t(); }

	T _t; // &lt;- HIER
};

template&lt;typename T&gt;
Foo&lt;T&gt; create_foo(T t){
	return Foo&lt;T&gt;(t);
}

int main() {
	auto t = create_foo([](){return 'x';});
	char c = t();
}
</code></pre>
<p>Generell habe ich meine member-Variablen immer als letztes in meiner Klasse und die typedefs am Anfang. (Also ganz einfach persönlicher Stil) Diesen Code akzeptiert mein Compiler GCC 4.6.1 nicht, solange ich die markierte Zeile nicht vor das typedef ziehe, was allerdings eigentlich gegen meine persönliche Reihenfolge innerhalb einer Klasse/struct verstößt.</p>
<p>Bei Verwendung der auskommentierten Zeile erhalte ich ein:</p>
<blockquote>
<p>test.cpp: In instantiation of 'Foo&lt;main()::&lt;lambda()&gt; &gt;':<br />
test.cpp:21:39: instantiated from here<br />
test.cpp:6:36: error: cannot call member function 'main()::&lt;lambda()&gt;' without object<br />
test.cpp: In function 'int main()':<br />
test.cpp:22:13: error: no match for call to '(Foo&lt;main()::&lt;lambda()&gt; &gt;) ()'</p>
</blockquote>
<p>Klar hat der Compiler recht, dass ich ihm kein Objekt für den Funktionsaufruf zur Verfügung gestellt habe, allerdings sollte doch der Rückgabetyp - solange keine Template-Funktion - immer(?) abhängig von der Klasse sein, so dass er sie ermitteln könnte, oder?</p>
<p>Gibt es eine Möglichkeit ohne Reihenfolgeänderung?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/295422/decltype-t-operator-für-klassen-template-parameter-t</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 11:15:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/295422.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Nov 2011 23:39:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to decltype(T::operator()()) für Klassen-Template-Parameter T on Sun, 13 Nov 2011 23:40:25 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte einen typedef innerhalb einer Klasse definieren, der abhängig ist von dem Rückgabe-Typ einer Funktion, die als Template-Parameter an die Klasse übergeben wird. (EDIT: Klar ist die Funktion nicht selbst der Template-Parameter)</p>
<p>Also ich meine etwa so etwas:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct Foo{

	typedef decltype(_t()) type;
	//typedef decltype(T::operator()()) type;
	Foo(T t) : _t(t){}

	type operator()(){ return _t(); }

	T _t; // &lt;- HIER
};

template&lt;typename T&gt;
Foo&lt;T&gt; create_foo(T t){
	return Foo&lt;T&gt;(t);
}

int main() {
	auto t = create_foo([](){return 'x';});
	char c = t();
}
</code></pre>
<p>Generell habe ich meine member-Variablen immer als letztes in meiner Klasse und die typedefs am Anfang. (Also ganz einfach persönlicher Stil) Diesen Code akzeptiert mein Compiler GCC 4.6.1 nicht, solange ich die markierte Zeile nicht vor das typedef ziehe, was allerdings eigentlich gegen meine persönliche Reihenfolge innerhalb einer Klasse/struct verstößt.</p>
<p>Bei Verwendung der auskommentierten Zeile erhalte ich ein:</p>
<blockquote>
<p>test.cpp: In instantiation of 'Foo&lt;main()::&lt;lambda()&gt; &gt;':<br />
test.cpp:21:39: instantiated from here<br />
test.cpp:6:36: error: cannot call member function 'main()::&lt;lambda()&gt;' without object<br />
test.cpp: In function 'int main()':<br />
test.cpp:22:13: error: no match for call to '(Foo&lt;main()::&lt;lambda()&gt; &gt;) ()'</p>
</blockquote>
<p>Klar hat der Compiler recht, dass ich ihm kein Objekt für den Funktionsaufruf zur Verfügung gestellt habe, allerdings sollte doch der Rückgabetyp - solange keine Template-Funktion - immer(?) abhängig von der Klasse sein, so dass er sie ermitteln könnte, oder?</p>
<p>Gibt es eine Möglichkeit ohne Reihenfolgeänderung?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144172</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 13 Nov 2011 23:40:25 GMT</pubDate></item><item><title><![CDATA[Reply to decltype(T::operator()()) für Klassen-Template-Parameter T on Sun, 13 Nov 2011 23:54:54 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typedef decltype(std::declval&lt;T&gt;()()) type;
</code></pre>
<p>würde sich anbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144179</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 13 Nov 2011 23:54:54 GMT</pubDate></item><item><title><![CDATA[Reply to decltype(T::operator()()) für Klassen-Template-Parameter T on Mon, 14 Nov 2011 00:23:24 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typedef decltype(std::declval&lt;T&gt;()()) type;
</code></pre>
<p>würde sich anbieten.</p>
</blockquote>
<p>Stimmt...<br />
Auf declval hast du mich schonmal aufmerksam gemacht... (EDIT: Naja... krümelkacker wars <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>Perfekt!!! <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/2144188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144188</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Mon, 14 Nov 2011 00:23:24 GMT</pubDate></item><item><title><![CDATA[Reply to decltype(T::operator()()) für Klassen-Template-Parameter T on Mon, 14 Nov 2011 11:58:40 GMT]]></title><description><![CDATA[<p>Es gibt auch noch result_of:</p>
<pre><code class="language-cpp">typename std::result_of&lt;T()&gt;::type
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2144325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144325</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Nov 2011 11:58:40 GMT</pubDate></item><item><title><![CDATA[Reply to decltype(T::operator()()) für Klassen-Template-Parameter T on Mon, 14 Nov 2011 19:38:41 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Es gibt auch noch result_of:</p>
<pre><code class="language-cpp">typename std::result_of&lt;T()&gt;::type
</code></pre>
</blockquote>
<p>DANKE!!! <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/2144530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144530</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Mon, 14 Nov 2011 19:38:41 GMT</pubDate></item></channel></rss>