<?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-Tricks]]></title><description><![CDATA[<p>Ich lese also gerade durch die luabind-Quellen und da fallen mir jetzt an allen Ecken und Enden Tricks auf, die ich auf Anhieb erstmal nicht nachvollziehen kann. Also wird dieser Thread hier bestimmt über die Zeit anwachsen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Erste Stelle:</p>
<pre><code class="language-cpp">typedef char(&amp;yes_t)[1];
typedef char(&amp;no_t)[2];

yes_t is_policy_cons_test(const null_type&amp;);
template&lt;class H, class T&gt;
yes_t is_policy_cons_test(const policy_cons&lt;H,T&gt;&amp;);
no_t is_policy_cons_test(...);

template&lt;class T&gt;
struct is_policy_cons
{
	static const T&amp; t;
	BOOST_STATIC_CONSTANT(bool, value = sizeof(is_policy_cons_test(t)) == sizeof(yes_t));

	typedef boost::mpl::bool_&lt;value&gt; type;
};
</code></pre>
<p>Kann man das nicht eigentlich auch mit einer einfachen Spezialisierung regeln? Ich nehme mal an nicht und da frage ich euch, welche zusätzlichen Fälle bedient dieses komische Konstrukt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/314193/template-tricks</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 09:48:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314193.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 23 Feb 2013 08:52:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 08:52:54 GMT]]></title><description><![CDATA[<p>Ich lese also gerade durch die luabind-Quellen und da fallen mir jetzt an allen Ecken und Enden Tricks auf, die ich auf Anhieb erstmal nicht nachvollziehen kann. Also wird dieser Thread hier bestimmt über die Zeit anwachsen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Erste Stelle:</p>
<pre><code class="language-cpp">typedef char(&amp;yes_t)[1];
typedef char(&amp;no_t)[2];

yes_t is_policy_cons_test(const null_type&amp;);
template&lt;class H, class T&gt;
yes_t is_policy_cons_test(const policy_cons&lt;H,T&gt;&amp;);
no_t is_policy_cons_test(...);

template&lt;class T&gt;
struct is_policy_cons
{
	static const T&amp; t;
	BOOST_STATIC_CONSTANT(bool, value = sizeof(is_policy_cons_test(t)) == sizeof(yes_t));

	typedef boost::mpl::bool_&lt;value&gt; type;
};
</code></pre>
<p>Kann man das nicht eigentlich auch mit einer einfachen Spezialisierung regeln? Ich nehme mal an nicht und da frage ich euch, welche zusätzlichen Fälle bedient dieses komische Konstrukt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301268</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 08:52:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 08:57:56 GMT]]></title><description><![CDATA[<p>Überladung. Der passendere Typ wird genommen.<br />
Matcht die</p>
<pre><code>yes_t is_policy_cons_test(const policy_cons&lt;H,T&gt;&amp;);
</code></pre>
<p>?<br />
Dann wi5rd sie genommen.<br />
Falls nicht, wird die</p>
<pre><code>no_t is_policy_cons_test(...);
</code></pre>
<p>genommen.</p>
<p>Und der Trick ist nur, den Rückgabetyp anzuschauen.<br />
Hab ich ein Objekt t, dann ist</p>
<pre><code>sizeof(is_policy_cons_test(t))
</code></pre>
<p>je nach dem 1 oder 2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301269</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 23 Feb 2013 08:57:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 09:00:54 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>welche zusätzlichen Fälle bedient dieses komische Konstrukt?</p>
</blockquote>
<p>Ähm, es gibt die Anzwort als Compilezeit-Konstante. Zu verwenden für static_assert oder als Template-Parameter für weitere Template-Rechnungen. Oder zum sicheren Wegoptimieren von Fallunterscheidungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301270</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 23 Feb 2013 09:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 09:41:31 GMT]]></title><description><![CDATA[<p>Also soweit meinte ich das zumindest schon verstanden zu haben, ich meinte vor allem, was ist der Unterschied zu folgendem:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct is_policy_cons
{
    static const bool value = false;
};

template&lt; typename H, typename T &gt;
struct is_policy_cons&lt; policy_cons&lt;H,T&gt; &gt;
{
  static const bool value = true;
};

template&lt; &gt;
struct is_policy_cons&lt; null_type &gt;
{
  static const bool value = true;
};
</code></pre>
<p>Edit: Das wäre jetzt die Variante, die ich erstmal intuitiv zur Lösung des Problems gewählt hätte, aber die muss ja offenbar der Variante da oben unterlegen sein.<br />
Edit #2: Oh, die Variante da oben catched auch alle abgelittenen Klassen und mein Template so erstmal nicht, oder?</p>
<p>Okay: Diesen Trick klassifiziere ich unter &quot;Matche den speziellen Template-Typ und alle abgelittenen Typen. Fällt mir auch erstmal keine <s>elegante</s> andere Lösung ein. (Wobei man aber sagen muss, dass diese Lösung hässlich ist und eine schwäche des Template-Systems darstellt, hehe)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301271</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 09:41:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 09:40:43 GMT]]></title><description><![CDATA[<p>Gibt es denn eigentlich irgendeinen Grund, aus dem man folgendes Konstrukt nicht erlaubt hat?</p>
<pre><code class="language-cpp">template&lt; typename D, template&lt;typename,typename&gt; class B, typename B1, typename B2 &gt;
// B ist also ein unspezialisiertes Template mit 2 Parametern
struct is_template_base_of&lt; D, B&lt;B1,B2&gt; &gt;
{
};

template&lt; typename T &gt;
struct is_policy_cons3 : public is_template_base_of&lt; T, policy_cons &gt;
{
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2301274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301274</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 09:40:43 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 09:44:00 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Gibt es denn eigentlich irgendeinen Grund, aus dem man folgendes Konstrukt nicht erlaubt hat?</p>
</blockquote>
<p>Jo, is sogar ziemlich simpel: Es macht keinen Sinn. Oder nach welchem Verfahren soll der Compiler B1 und B2 erraten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301276</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 23 Feb 2013 09:44:00 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 09:47:00 GMT]]></title><description><![CDATA[<p>Nunja, das Erraten soll dann stattfinden, wenn D auf ein Vorkommen von B als Basis untersucht wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> oder so ähnlich. B1 und B2 sind natürlich unnötig, da hast du Recht. Ich frickel mal weiter rum. Dieser Funktionstrick ist irgendwie so hässlich, da muss es doch was von Ratiopharm geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301277</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 09:47:00 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 09:44:51 GMT]]></title><description><![CDATA[<p>Auf die Sekunde genau editiert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301278</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 23 Feb 2013 09:44:51 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 09:54:07 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>[...] ich meinte vor allem, was ist der Unterschied zu folgendem:<br />
[...]</p>
</blockquote>
<p>Es tut etwas völlig anderes?</p>
<p>Decimad schrieb:</p>
<blockquote>
<p>Edit #2: Oh, die Variante da oben catched auch alle abgelittenen Klassen und mein Template so erstmal nicht, oder?</p>
</blockquote>
<p>Genau das ist der Sinn, ja...</p>
<p>Decimad schrieb:</p>
<blockquote>
<p>Dieser Funktionstrick ist irgendwie so hässlich, da muss es doch was von Ratiopharm geben.</p>
</blockquote>
<p>Was findest du daran denn so hässlich, ich find den eigentlich vergleichsweise elegant!?</p>
<p>Kannst ja auch mal einen Blick auf <a href="http://en.cppreference.com/w/cpp/types/is_base_of" rel="nofollow">std::is_base_of</a> werfen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301281</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 23 Feb 2013 09:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 10:17:42 GMT]]></title><description><![CDATA[<p>Na aber is_base_of kann auch nicht mit unspezialisierten Template-Klassen umgehen.</p>
<p>Und hässlich daran ist folgendes: Das Templete-System ist &quot;zu schwach&quot; und dann fängt man an, hinter der Template-Fassade freie Template-Funktionen zu deklarieren um auf das Überladungs-System auszuweichen zum Zwecke der statischen Typanalyse.</p>
<p>Da steht natürlich noch die Frage im Raum, wozu dieser spezielle Check dienen soll, und ob man mit ihm nicht versucht, die leider noch fehlenden Concepts zu simulieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301284</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 10:17:42 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 10:17:19 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Na aber is_base_of kann auch nicht mit unspezialisierten Template-Klassen umgehen.</p>
</blockquote>
<p>Du meinst Klassentemplates? Wie genau sollte das auch funktionieren, ein Template ist keine Klasse (sondern eben ein Template), da von einer Basisklasse zu sprechen, macht also gar keinen Sinn!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301286</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 23 Feb 2013 10:17:19 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 10:20:24 GMT]]></title><description><![CDATA[<p>Na das funktioniert genau so, wie das Quelltextbeispiel im ersten Posting darstellt.</p>
<p>Davon zu sprechen, dass die Spezialisierung eines Klassentemplates Basis einer anderen Klasse ist, ergibt in meiner Logik irgendwie Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301288</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 10:20:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 10:24:36 GMT]]></title><description><![CDATA[<p>Luabind... ich habe mal versucht, den Quellcode zu verstehen, weil ich ein paar Anpassungen machen wollte... nach einer Quellcode-Datei hab ichs sein lassen.</p>
<p>Dafür ist es aber auch eine der coolsten Bibliotheken (aus Anwendersicht), mit denen ich je gearbeitet hab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301289</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 10:24:36 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 10:30:04 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Davon zu sprechen, dass die Spezialisierung eines Klassentemplates Basis einer anderen Klasse ist, ergibt in meiner Logik irgendwie Sinn.</p>
</blockquote>
<p>Meinst du mit &quot;Spezialisierung eines Klassentemplate&quot; eine Instanz desselben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301290</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 23 Feb 2013 10:30:04 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 10:32:07 GMT]]></title><description><![CDATA[<p>Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301291</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 10:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 10:38:46 GMT]]></title><description><![CDATA[<p>In dem Fall versteh ich nicht, was genau das Problem mit std::is_base_of sein soll!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301292</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 23 Feb 2013 10:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 11:17:15 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt; typename H, typename T &gt;
struct policy_cons
{
	typedef H head;
	typedef T tail;
};

struct mycons : public policy_cons&lt; int, int &gt;
{
};

int main(int argc, char* argv[])
{
	std::cout &lt;&lt; std::is_base_of&lt; policy_cons, mycons &gt;::value; // Schade...
	return 0;
}
</code></pre>
<p>Edit: Mit Ja. meinte ich eine beliebige Instanz desselben, nicht eine bestimmte.</p>
<p>Dort liegt das Problem. Das Konstrukt, dass ich in meinem OP aus den luabind-Quellen kopiert habe, löst genau das Problem.<br />
Edit: Und es löst das Problem auf eine Art und Weise, die nicht generalisierbar ist. Für jedes Klassentemplate muss man einen neuen Satz von Funktionen definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301299</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 11:17:15 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 11:25:54 GMT]]></title><description><![CDATA[<p>Was genau ist der Sinn, wofür denkst du das zu brauchen!? Imo mach das keinen Sinn, da Ableitungsbeziehungen Beziehungen zwischen Klassen sind und nicht zwischen Templates. In deinem konkreten Beispiel ist genau eine Instanz von policy_cons Basis von mycons und nicht jede beliebige Instanz. Ich vermute, dass du da gerade entweder versuchst, ein Problem zu lösen, das keines ist, versuchst eine Lösung zu finden, zu der es kein Problem gibt oder einen Weg verfolgst, der zu nichts führt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301300</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 23 Feb 2013 11:25:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 11:27:05 GMT]]></title><description><![CDATA[<p>Ich versuche damit gar nichts zu lösen. Die Quellen sind so aus luabind kopiert und ich denke die Jungs hinter luabind machten so Template-Parameter-type-checks aufgrund nicht vorhandener C++-Concepts.<br />
Und dieser Hack oder dass es dann die C++-Concepts machen müssen ist für mich ein Beleg dafür, dass Klassentemplates keine Form von Metatyp im C++-Typsystem sind, das System in sich sozusagen inkonsistent ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301302</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 11:27:05 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 11:34:26 GMT]]></title><description><![CDATA[<p>Ok, jetzt kann ich leider nicht mehr folgen. Ich bezweifle, dass ein Release von luabind Code enthält, der nicht kompilieren wird, weil er keinen Sinn macht. Ergo kann es nicht sein, dass obiger Code &quot;aus luabind kopiert&quot; ist. Ich versteh nicht, worauf du hinaus willst und wieso das C++ Typsystem inkonsistent sein soll, weil es die willkürliche Vermischung von Konzepten völlig verschiedener Ebenen nicht erlaubt, erschließt sich mir auch nicht...</p>
<p>Also: Was genau ist deine Frage?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301303</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 23 Feb 2013 11:34:26 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 11:37:35 GMT]]></title><description><![CDATA[<p>Natürlich steht das is_base_of, so wie ich es oben gepostet habe, nicht in deren Quelltext. Aber eben das funktionierende Äquivalent dazu (siehe OP).<br />
Und es ist natürlich nicht das komplette Äquivalent, weil die Implementierung eben nur für dieses eine spezielle Klassentemplate funktioniert und für jedes andere Klassentemplate erneut implementiert werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301304</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 11:37:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 11:38:24 GMT]]></title><description><![CDATA[<p>Ja!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301306</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 23 Feb 2013 11:38:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 11:43:45 GMT]]></title><description><![CDATA[<p>Na, ist ja auch egal. Was das Konstrukt aus dem OP nun lösen soll, ist mir ja inzwischen klar und ob es gut ist, dass es keine generelle Lösung dafür gibt, sowie ob die Lösung selber elegant aussieht, das mag wohl im Auge des Betrachters liegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301310</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 11:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 11:56:31 GMT]]></title><description><![CDATA[<p>Im Gegensatz zu der von dir vorgeschlagenen Syntax, überprüft der Code aus dem OP, ob eine Klasse von einer konkreten Instanz eines konkreten Template abgeleitet ist. Inkonsistent wäre das Typsystem imo dagegen, wenn sowas wie <code>std::is_base_of&lt;policy_cons, mycons&gt;</code> gültig wäre, da du da ein Template stehen hast, wo eigentlich ein Typ erwartet wird (was du suchst ist ja eigentlich ein <code>std::is_base_instance_of</code> ). Eine generische Lösung lässt sich vermutlich analog zum OP mit Variadic Templates bauen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301311</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 23 Feb 2013 11:56:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 12:07:48 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Im Gegensatz zu der von dir vorgeschlagenen Syntax, überprüft der Code aus dem OP, ob eine Klasse von einer konkreten Instanz eines konkreten Template abgeleitet ist.</p>
</blockquote>
<p>Nein. Es prüft ob die Klasse von einer beliebigen instanz abgeleitet ist. Der Compiler ist nur smart genug zu bestimmen, welche möglicheen instanzparameter dafür in betracht kommen.</p>
<p>Semantisch ist das Ding: &quot;ist X von einem Foo&lt;T&gt; mit beliebigem T abgeleitet&quot;?<br />
Und Decimad hängt sich zurecht daran auf, dass der Ansatz nicht auf beliebige Foo generalisierbar ohne für jedes Foo einen konkreten Satz an Funktionen/Klassen zu verwenden. Und ja, das ist Schade und eine Schwäche des Typsystems, denn ich verwende &quot;is_base_of&quot; fast nie, im Gegensatz zu einem &quot;is_derived_from_some_arbitraryFooT&quot;</p>
<p>//edit um Konstruktiv zu sein Keine Ahnung ob das compiliert, müsste aber gehen:</p>
<pre><code>template&lt;class T, class template&lt;class&gt; Foo&gt;
struct is_derived_from_unary_arg_template_base
{
    template&lt;class H&gt;
    yes_t test(const Foo&lt;H&gt;&amp;);
    no_t test(...);

    static const T&amp; t;
    BOOST_STATIC_CONSTANT(bool, value = sizeof(test(t)) == sizeof(yes_t));

    typedef boost::mpl::bool_&lt;value&gt; type;
};

template&lt;class H&gt;
class Foo{};

class Bar:public Foo&lt;int&gt;{};

is_derived_from_unary_arg_template_base&lt;Bar, Foo&gt;::value
</code></pre>
<p>interessant wirds dann aber herauszufinden, welches Foo&lt;H&gt; es genau ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301312</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 23 Feb 2013 12:07:48 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Tricks on Sat, 23 Feb 2013 12:16:32 GMT]]></title><description><![CDATA[<p>Hrmm, ja, erstmal Danke Otze dass Du so nett bist, dass ich mir hier nicht komplett blöde vorkommen muss. Irgendwann wird es bei mir wohl mit den Namen auch mal besser, hoffentlich.</p>
<p>Ich probiere das mal aus. Sieht auf den ersten Blick auf jeden Fall so aus, dass man besser versteht, was das ganze eigentlich machen soll!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301316</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Feb 2013 12:16:32 GMT</pubDate></item></channel></rss>