<?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-argumente einer basisklasse extrahieren]]></title><description><![CDATA[<p>hi</p>
<p>in meiner klassenhierarchie leiten ne menge klassen von derselben basisklasse ab. diese basisklasse ist eigentlich ein klassentemplate. da ich in der funktion f mit dem template-argument der basisklasse arbeiten möchte muss ich das irgendwie extrahieren</p>
<pre><code>template&lt;int v&gt;
struct base { };

template&lt;typename T&gt;
void f(T const&amp; x)
{
	//brauche hier x.base&lt;&gt;::v als compile-time-konstante (damit ich es an ein anderes template übergeben kann)
}
</code></pre>
<p>andererseits kann ich die signatur nicht in <code>f(base&lt;v&gt; const&amp;)</code> ändern, da die abgeleiteten klassen gewisse methoden implementieren, die ich innerhalb von f auch noch brauche (ich brauche den übergebenen typen einfach...).</p>
<p>kann ich das irgendwie bewerkstelligen, ohne dass v in abgeleiteten klassen zugänglich ist? (ja, die unmittelbar ableitenden klassen kennen v ohnehin, aber der &quot;stammbaum&quot; ist ziemlich gross und hat viele &quot;generationen&quot;)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328586/template-argumente-einer-basisklasse-extrahieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 13:07:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328586.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 Oct 2014 12:52:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template-argumente einer basisklasse extrahieren on Fri, 17 Oct 2014 12:52:29 GMT]]></title><description><![CDATA[<p>hi</p>
<p>in meiner klassenhierarchie leiten ne menge klassen von derselben basisklasse ab. diese basisklasse ist eigentlich ein klassentemplate. da ich in der funktion f mit dem template-argument der basisklasse arbeiten möchte muss ich das irgendwie extrahieren</p>
<pre><code>template&lt;int v&gt;
struct base { };

template&lt;typename T&gt;
void f(T const&amp; x)
{
	//brauche hier x.base&lt;&gt;::v als compile-time-konstante (damit ich es an ein anderes template übergeben kann)
}
</code></pre>
<p>andererseits kann ich die signatur nicht in <code>f(base&lt;v&gt; const&amp;)</code> ändern, da die abgeleiteten klassen gewisse methoden implementieren, die ich innerhalb von f auch noch brauche (ich brauche den übergebenen typen einfach...).</p>
<p>kann ich das irgendwie bewerkstelligen, ohne dass v in abgeleiteten klassen zugänglich ist? (ja, die unmittelbar ableitenden klassen kennen v ohnehin, aber der &quot;stammbaum&quot; ist ziemlich gross und hat viele &quot;generationen&quot;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2422648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422648</guid><dc:creator><![CDATA[hanstroll123]]></dc:creator><pubDate>Fri, 17 Oct 2014 12:52:29 GMT</pubDate></item><item><title><![CDATA[Reply to template-argumente einer basisklasse extrahieren on Fri, 17 Oct 2014 12:56:07 GMT]]></title><description><![CDATA[<p>hanstroll123 schrieb:</p>
<blockquote>
<p>andererseits kann ich die signatur nicht in <code>f(base&lt;v&gt; const&amp;)</code> ändern</p>
</blockquote>
<p>aber als Hilfsfunktion taugt das.</p>
<pre><code class="language-cpp">template&lt;int v&gt;
struct base { };

template &lt;int v&gt;
std::integral_constant&lt;int,v&gt; base_helper(base&lt;v&gt;&amp;&amp;);

template&lt;typename T&gt;
void f(T const&amp; x)
{
    constexpr auto v = decltype(base_helper(x))::value;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2422651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422651</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 17 Oct 2014 12:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to template-argumente einer basisklasse extrahieren on Fri, 17 Oct 2014 13:13:06 GMT]]></title><description><![CDATA[<p>guter ansatz, wollte gerade fragen wie ich das in c++03 machen kann, habe es aber schon selbst geschafft (vorsicht, gebastel):</p>
<pre><code>#include &lt;iostream&gt;

template&lt;typename T&gt;
struct id { typedef T type; };

template&lt;int v&gt;
struct sz_type : public id&lt;char(&amp;)[v]&gt; {};

template&lt;int v&gt;
struct base {};

struct fun : base&lt;42&gt;
{
	void f() const { std::cout &lt;&lt; &quot;hello&quot;; }
};

template&lt;int v&gt;
typename sz_type&lt;v&gt;::type help(base&lt;v&gt; const&amp;);

template&lt;typename T&gt;
void f(T const&amp;x)
{
	x.f();
	base&lt;sizeof(help(x))&gt;();
}

int main()
{
	f(fun());
}
</code></pre>
<p>jetzt nur noch für nicht-positive int's, hmm vll. zweierkomplement selbst anwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2422655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422655</guid><dc:creator><![CDATA[hanstroll123]]></dc:creator><pubDate>Fri, 17 Oct 2014 13:13:06 GMT</pubDate></item><item><title><![CDATA[Reply to template-argumente einer basisklasse extrahieren on Fri, 17 Oct 2014 17:01:10 GMT]]></title><description><![CDATA[<pre><code>template &lt;int v&gt;
std::integral_constant&lt;int,v&gt; base_helper(base&lt;v&gt;&amp;&amp;);

template&lt;typename T&gt;
void f(T const&amp; x)
{
    constexpr auto v = decltype(base_helper(x))::value;
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Ich glaube langsam du wirst Meschugge.</p>
<p>Mit C++03 sieht das Ganze so aus:</p>
<pre><code>template &lt;typename&gt; struct extract;
template &lt;int v&gt;
struct extract&lt;base&lt;v&gt;&gt; {static int const value = v;};

template&lt;typename T&gt;
void f(T const&amp; x)
{
	std::cout &lt;&lt; extract&lt;T&gt;::value;
}

int main()
{
	f(base&lt;4&gt;());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2422682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422682</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 17 Oct 2014 17:01:10 GMT</pubDate></item><item><title><![CDATA[Reply to template-argumente einer basisklasse extrahieren on Fri, 17 Oct 2014 19:28:31 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Ich glaube langsam du wirst Meschugge.</p>
</blockquote>
<p>Macht Spass, solltest du auch mal versuchen.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Mit C++03 sieht das Ganze so aus:</p>
<pre><code>template &lt;typename&gt; struct extract;
template &lt;int v&gt;
struct extract&lt;base&lt;v&gt;&gt; {static int const value = v;};

template&lt;typename T&gt;
void f(T const&amp; x)
{
	std::cout &lt;&lt; extract&lt;T&gt;::value;
}

int main()
{
	f(base&lt;4&gt;());
}
</code></pre>
</blockquote>
<p>langweilig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2422701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422701</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 17 Oct 2014 19:28:31 GMT</pubDate></item><item><title><![CDATA[Reply to template-argumente einer basisklasse extrahieren on Fri, 17 Oct 2014 21:16:23 GMT]]></title><description><![CDATA[<p>Da du mein #1-Vorbild bist habe ich wohl keine Wahl als dir zu folgen.</p>
<pre><code>template &lt;int v&gt;
char(&amp;foo(base&lt;v&gt;))[v];

template &lt;typename T&gt;
void bar(T t)
{
    std::cout &lt;&lt; sizeof(foo(t));
}
</code></pre>
<p>Besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2422713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422713</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 17 Oct 2014 21:16:23 GMT</pubDate></item><item><title><![CDATA[Reply to template-argumente einer basisklasse extrahieren on Fri, 17 Oct 2014 23:53:00 GMT]]></title><description><![CDATA[<p>Der Umweg über integral_constant in C++11 scheint mir eigentlich ein bisschen von hinten durch die Brust ins Auge geschossen. Mit constexpr geht es direkter:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;int v&gt; struct base { };
struct derived : base&lt;4&gt; { };

// Wichtiger Teil hier
template&lt;int v&gt;
int constexpr f(base&lt;v&gt; const &amp;) {
  return v;
}
// Wichtiger Teil zuende.

int main() {
  derived d;
  std::cout &lt;&lt; f(d) &lt;&lt; '\n';

  base&lt;f(d) * 2&gt; b;
  std::cout &lt;&lt; f(b) &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2422733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422733</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 17 Oct 2014 23:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to template-argumente einer basisklasse extrahieren on Sat, 18 Oct 2014 08:12:20 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Der Umweg über integral_constant in C++11 scheint mir eigentlich ein bisschen von hinten durch die Brust ins Auge geschossen. Mit constexpr geht es direkter:</p>
</blockquote>
<p>Das macht allerdings nicht den Funktionsaufruf zu einem konstanten Ausdruck, wenn das Argument nicht konstant ist.</p>
<pre><code class="language-cpp">include &lt;iostream&gt;

template&lt;int v&gt; struct base { };
struct derived : base&lt;4&gt; { };

template&lt;int v&gt;
int constexpr f(base&lt;v&gt; const &amp;) {
  return v;
}

int main() {
    constexpr auto x = f(*new derived); //
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2422751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422751</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 18 Oct 2014 08:12:20 GMT</pubDate></item><item><title><![CDATA[Reply to template-argumente einer basisklasse extrahieren on Sat, 18 Oct 2014 14:56:43 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Mit C++03 sieht das Ganze so aus:</p>
<pre><code>template &lt;typename&gt; struct extract;
template &lt;int v&gt;
struct extract&lt;base&lt;v&gt;&gt; {static int const value = v;};

template&lt;typename T&gt;
void f(T const&amp; x)
{
	std::cout &lt;&lt; extract&lt;T&gt;::value;
}

int main()
{
	f(base&lt;4&gt;());
}
</code></pre>
</blockquote>
<p>das ist nicht ganz das, was ich gesucht habe; T ist ein von base&lt;v&gt; abgeleiteter typ.</p>
<p>hat jemand eine bessere c++03-lösung als die meine?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2422800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422800</guid><dc:creator><![CDATA[hanstroll123]]></dc:creator><pubDate>Sat, 18 Oct 2014 14:56:43 GMT</pubDate></item><item><title><![CDATA[Reply to template-argumente einer basisklasse extrahieren on Sat, 18 Oct 2014 14:59:07 GMT]]></title><description><![CDATA[<p>Ups, tatsächlich, das war Quatsch.</p>
<p>Dann nimm die zweite von mir gepostete, die funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2422801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422801</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 18 Oct 2014 14:59:07 GMT</pubDate></item></channel></rss>