<?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[Entfernen von Top-Level const&#x2F;ref bei Template verhindern]]></title><description><![CDATA[<p>Hallo Leute!</p>
<p>Ich schreibe gerade ein Makro, das eine Variable Anzahl an Argumenten nimmt, die Variablen im Code sind. Innerhalb dieses Makros moechte ich jetzt eine Typliste generieren, die die Typen dieser Variablen enthaelt. Das sieht dann ungefaehr so aus:</p>
<pre><code class="language-cpp">template &lt;typename... Args&gt;
typelist&lt;Args...&gt; deduce(Args...);

#define TYPES_OF(...) decltype(deduce(__VA_ARGS__))
</code></pre>
<p>Das Problem ist aber, dass dabei Top-Level const/refs bei deduce einfach weggeschmissen werden. Und da man __VA_ARGS__ auch nicht expandieren kann, wie man es mit Variadic Templates kann, kann ich auch nicht einfach decltype(__VA_ARGS__) schreiben <a href="http://o.ae" rel="nofollow">o.ae</a>.</p>
<p>Hat da jemand eine Idee?</p>
<p>Gruesse,<br />
Der Kellerautomat</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307732/entfernen-von-top-level-const-ref-bei-template-verhindern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 16:00:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307732.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Sep 2012 02:30:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Entfernen von Top-Level const&#x2F;ref bei Template verhindern on Tue, 04 Sep 2012 02:35:04 GMT]]></title><description><![CDATA[<p>Hallo Leute!</p>
<p>Ich schreibe gerade ein Makro, das eine Variable Anzahl an Argumenten nimmt, die Variablen im Code sind. Innerhalb dieses Makros moechte ich jetzt eine Typliste generieren, die die Typen dieser Variablen enthaelt. Das sieht dann ungefaehr so aus:</p>
<pre><code class="language-cpp">template &lt;typename... Args&gt;
typelist&lt;Args...&gt; deduce(Args...);

#define TYPES_OF(...) decltype(deduce(__VA_ARGS__))
</code></pre>
<p>Das Problem ist aber, dass dabei Top-Level const/refs bei deduce einfach weggeschmissen werden. Und da man __VA_ARGS__ auch nicht expandieren kann, wie man es mit Variadic Templates kann, kann ich auch nicht einfach decltype(__VA_ARGS__) schreiben <a href="http://o.ae" rel="nofollow">o.ae</a>.</p>
<p>Hat da jemand eine Idee?</p>
<p>Gruesse,<br />
Der Kellerautomat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248279</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Tue, 04 Sep 2012 02:35:04 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen von Top-Level const&#x2F;ref bei Template verhindern on Tue, 04 Sep 2012 04:34:35 GMT]]></title><description><![CDATA[<p>Ich seh den Sinn nicht so ganz. Zeig doch mal, wie du das dann benutzen wollen würdest.</p>
<p>Durch deduce(Args&amp;&amp;...) bei der Deklaration von deduce behält man noch die constness und die Art der Wertkategorie, also ob es ein Lvalue oder Rvalueausdruck war, so dass</p>
<pre><code class="language-cpp">int i=2;
const double pi = 3.14159265;
TYPES_OF(i,pi,i+pi)
</code></pre>
<p>types&lt;int&amp;,const double&amp;,double&gt; liefern würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248280</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 04 Sep 2012 04:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to Entfernen von Top-Level const&#x2F;ref bei Template verhindern on Tue, 04 Sep 2012 04:42:01 GMT]]></title><description><![CDATA[<p>Oh man, ich bin auch doof. Ich hatte zuerst eine RValue Referenz drin, aber typeid(), das ich zur Ausgabe des Typen verwendet habe, streicht ja offenbar Top-Level immer weg. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Ich brauche das fuer Compiletime-Reflection. Ich hab das Beispiel nur aufs noetigste vereinfacht. Die uebergebenen Variablen sind in Wirklichkeit Member des zu inspizierenden Typs.</p>
<pre><code class="language-cpp">#define CTR_REFLECT_INFO(t, b, m) \
	namespace ctr \
	{ \
		template &lt;&gt; \
		struct reflect&lt;t&gt; : t \
		{ \
			static constexpr char full_name[] = #t; \
			typedef typelist&lt;b&gt; bases; \
			typedef decltype(deduce(m)) members; \
		}; \
		\
		constexpr char reflect&lt;t&gt;::full_name[]; \
	}
</code></pre>
<pre><code class="language-cpp">struct foo
{
	int const i;
};

struct bar : foo
{
	int p, q;
};

CTR_REFLECT_INFO(::foo, CTR_BASES(),    CTR_MEMBERS(i))
CTR_REFLECT_INFO(::bar, CTR_BASES(foo), CTR_MEMBERS(p, q))
</code></pre>
<p>:p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2248281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2248281</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Tue, 04 Sep 2012 04:42:01 GMT</pubDate></item></channel></rss>