<?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-Funktion für void foo(bar&amp;amp;) und void foo(const bar&amp;amp;)]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Template-Funktion mit einem Template-Parameter. Aus diesem Template-Parameter möchte ich mir eine Typ-Information holen.<br />
Wenn das übergeben Objekt const ist, dann wird ja auf dem Objekt eine entsprechende const-Funktion aufgerufen, ansonsten eine nicht-const-Funktion. In der Regel unterscheidet sich der Rückgabe-Typ ja um ein const.<br />
Wenn ich diesen Wert ja zwischenspeichern will, weiß ich nicht, ob es const ist oder nicht...<br />
Wie löse ich sowas am elegantesten?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

template&lt;typename T&gt;
class Foo{
public:
	typedef T type;
	T&amp; get(){return t;}
	const T&amp; get() const {return t;}

private:
	T t;
};

template&lt;typename T&gt;
static void print(T&amp; t){
	std::cout &lt;&lt; &quot;no const&quot; &lt;&lt; std::endl;
}

template&lt;typename T&gt;
static void print(const T&amp; t){
	std::cout &lt;&lt; &quot;const&quot; &lt;&lt; std::endl;
}

template&lt;typename F&gt;
void bar(F&amp; f){
	typedef typename F::type type;
	type&amp; t = f.get(); // Hier ist das Zwischenspeichern in einer Variable natürlich unnötig, aber in meinem komplexen Szenario benötige ich es
	print(t);
}

int main(){
	Foo&lt;std::string&gt; foo1;
	bar(foo1);
	const Foo&lt;std::string&gt;&amp; foo2 (foo1);
	bar(foo2);

}
</code></pre>
<p>Verständlicherweise krieg ich hier ein:</p>
<pre><code>test.cpp: In function 'void bar(F&amp;) [with F = const Foo&lt;std::basic_string&lt;char&gt; &gt;]':
test.cpp:36:10:   instantiated from here
test.cpp:28:18: error: invalid initialization of reference of type 'type&amp;' from expression of type 'const std::basic_string&lt;char&gt;'
</code></pre>
<p>Ich progge C++0x, deswegen dachte ich an auto als Rückgabe-Typ, jedoch riecht es (denke ich) nach einem gcc-Bug:</p>
<pre><code class="language-cpp">auto t = f.get();
</code></pre>
<blockquote>
<p>no const<br />
no const</p>
</blockquote>
<p>Also meine Idee wäre:</p>
<pre><code class="language-cpp">template&lt;typename T, typename T2&gt;
struct const_info{
	typedef T2 type;
};

template&lt;typename T, typename T2&gt;
struct const_info&lt;const T, T2&gt;{
	typedef const T2 type;
};
</code></pre>
<pre><code class="language-cpp">typedef typename const_info&lt;F, type&gt;::type fixed_type;
	fixed_type&amp; t = f.get();
</code></pre>
<blockquote>
<p>no const<br />
const</p>
</blockquote>
<p>Geht es auch einfacher/sauberer oder einen entsprechenden boost-type-trait?<br />
Das struct verfügt natürlich wegen Wiederverwendbarkeit (Name des typedef) über zwei Template-Parameter, sonst natürlich auch mit einem Template-Parameter möglich...</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292776/template-funktion-für-void-foo-bar-amp-und-void-foo-const-bar-amp</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 17:19:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292776.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 Sep 2011 18:54:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Funktion für void foo(bar&amp;amp;) und void foo(const bar&amp;amp;) on Sat, 17 Sep 2011 18:54:35 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Template-Funktion mit einem Template-Parameter. Aus diesem Template-Parameter möchte ich mir eine Typ-Information holen.<br />
Wenn das übergeben Objekt const ist, dann wird ja auf dem Objekt eine entsprechende const-Funktion aufgerufen, ansonsten eine nicht-const-Funktion. In der Regel unterscheidet sich der Rückgabe-Typ ja um ein const.<br />
Wenn ich diesen Wert ja zwischenspeichern will, weiß ich nicht, ob es const ist oder nicht...<br />
Wie löse ich sowas am elegantesten?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

template&lt;typename T&gt;
class Foo{
public:
	typedef T type;
	T&amp; get(){return t;}
	const T&amp; get() const {return t;}

private:
	T t;
};

template&lt;typename T&gt;
static void print(T&amp; t){
	std::cout &lt;&lt; &quot;no const&quot; &lt;&lt; std::endl;
}

template&lt;typename T&gt;
static void print(const T&amp; t){
	std::cout &lt;&lt; &quot;const&quot; &lt;&lt; std::endl;
}

template&lt;typename F&gt;
void bar(F&amp; f){
	typedef typename F::type type;
	type&amp; t = f.get(); // Hier ist das Zwischenspeichern in einer Variable natürlich unnötig, aber in meinem komplexen Szenario benötige ich es
	print(t);
}

int main(){
	Foo&lt;std::string&gt; foo1;
	bar(foo1);
	const Foo&lt;std::string&gt;&amp; foo2 (foo1);
	bar(foo2);

}
</code></pre>
<p>Verständlicherweise krieg ich hier ein:</p>
<pre><code>test.cpp: In function 'void bar(F&amp;) [with F = const Foo&lt;std::basic_string&lt;char&gt; &gt;]':
test.cpp:36:10:   instantiated from here
test.cpp:28:18: error: invalid initialization of reference of type 'type&amp;' from expression of type 'const std::basic_string&lt;char&gt;'
</code></pre>
<p>Ich progge C++0x, deswegen dachte ich an auto als Rückgabe-Typ, jedoch riecht es (denke ich) nach einem gcc-Bug:</p>
<pre><code class="language-cpp">auto t = f.get();
</code></pre>
<blockquote>
<p>no const<br />
no const</p>
</blockquote>
<p>Also meine Idee wäre:</p>
<pre><code class="language-cpp">template&lt;typename T, typename T2&gt;
struct const_info{
	typedef T2 type;
};

template&lt;typename T, typename T2&gt;
struct const_info&lt;const T, T2&gt;{
	typedef const T2 type;
};
</code></pre>
<pre><code class="language-cpp">typedef typename const_info&lt;F, type&gt;::type fixed_type;
	fixed_type&amp; t = f.get();
</code></pre>
<blockquote>
<p>no const<br />
const</p>
</blockquote>
<p>Geht es auch einfacher/sauberer oder einen entsprechenden boost-type-trait?<br />
Das struct verfügt natürlich wegen Wiederverwendbarkeit (Name des typedef) über zwei Template-Parameter, sonst natürlich auch mit einem Template-Parameter möglich...</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2120549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120549</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 17 Sep 2011 18:54:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Funktion für void foo(bar&amp;amp;) und void foo(const bar&amp;amp;) on Sat, 17 Sep 2011 19:04:34 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Ich progge C++0x, deswegen dachte ich an auto als Rückgabe-Typ, jedoch riecht es (denke ich) nach einem gcc-Bug:</p>
<pre><code class="language-cpp">auto t = f.get();
</code></pre>
</blockquote>
<p>Das ist kein Bug, sondern einfach eine normale Variable. Wenn du eine Referenz drauß machen möchtest, solltest du <code>auto&amp;</code> schreiben.[/quote]</p>
<p>Zum type_trait: ein <code>is_const&lt;typename remove_reference&lt;F&gt;::type&gt;</code> sollte es bringen.<br />
Du könntest t natürlich auch mit einem <code>decltype(f.get()) t = f.get()</code> initialisieren <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/2120550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120550</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 17 Sep 2011 19:04:34 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Funktion für void foo(bar&amp;amp;) und void foo(const bar&amp;amp;) on Sat, 17 Sep 2011 19:26:33 GMT]]></title><description><![CDATA[<p>Danke pumuckl!</p>
<p>Aber warum hat man bei der Verwendung von auto keine Referenz?<br />
Ich hätte den Rückgabe-Typ der Funktion erwartet...</p>
<p>Ich werde zukünftig wohl decltype(f.get()) favorisieren...<br />
<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/2120556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120556</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 17 Sep 2011 19:26:33 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Funktion für void foo(bar&amp;amp;) und void foo(const bar&amp;amp;) on Sat, 17 Sep 2011 20:54:10 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Aber warum hat man bei der Verwendung von auto keine Referenz?</p>
</blockquote>
<p>Wie würdest du dann eine Non-Reference definiteren wollen, die mit der Reference-Rückgabe einer Funktion initialisiert wird? Dann lieber mit <code>auto&amp;</code> explizit ne Referenz draus machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2120603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120603</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 17 Sep 2011 20:54:10 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Funktion für void foo(bar&amp;amp;) und void foo(const bar&amp;amp;) on Sat, 17 Sep 2011 23:46:52 GMT]]></title><description><![CDATA[<p>Eine Frage habe ich doch noch...</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Zum type_trait: ein <code>is_const&lt;typename remove_reference&lt;F&gt;::type&gt;</code> sollte es bringen.</p>
</blockquote>
<p>Wie bringt mich der boolsche Wert bei einem typedef weiter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2120645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120645</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 17 Sep 2011 23:46:52 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Funktion für void foo(bar&amp;amp;) und void foo(const bar&amp;amp;) on Sun, 18 Sep 2011 00:14:49 GMT]]></title><description><![CDATA[<p>-- Empty Post --</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2120653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120653</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 18 Sep 2011 00:14:49 GMT</pubDate></item></channel></rss>