<?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 in Liste suchen]]></title><description><![CDATA[<p>Hallo da!<br />
Abends spiele ich ja gerne mal mit templates herum, nun wollte ich schauen, ob ich herausfinden kann, ob ein Typ ein bestimmtes Template ist.<br />
Bevor ich den Code poste, hier schon einmal die Frage: Geht das nicht auch irgendwie einfacher?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

namespace test {

    template&lt; typename... T &gt;
    struct type_list {};

    template&lt; template&lt; typename... &gt; class Template, typename... Arguments &gt;
    type_list&lt;Arguments...&gt; deduce_template_arguments(Template&lt;Arguments...&gt;*);

    template&lt; typename T &gt;
    type_list&lt;&gt; deduce_template_arguments(T*);

    template&lt; typename T &gt;
    struct foo {
        using type = void;
    };

    template&lt; typename Instance, typename ArgList, template&lt; typename... &gt; class Template, typename EnableIf = void &gt;
    struct is_same_template_intern : public std::false_type
    {};

    template&lt; typename Instance, typename... Args, template&lt; typename... &gt; class Template &gt;
    struct is_same_template_intern&lt;Instance, type_list&lt;Args...&gt;, Template, typename foo&lt;Template&lt;Args...&gt;&gt;::type &gt;
    : public std::conditional&lt; std::is_same&lt; Instance, Template&lt;Args...&gt; &gt;::value, std::true_type, std::false_type &gt;::type
    {};

    template&lt; typename Instance, template&lt; typename... &gt; class Template &gt;
    struct is_same_template : public is_same_template_intern&lt; Instance, decltype(deduce_template_arguments((Instance*)nullptr)), Template &gt;
    {};

}

template&lt; typename T &gt;
struct test_struct {
};

template&lt; typename T1, typename T2 &gt;
struct test_struct2 {
};

int main()
{
    std::cout &lt;&lt; test::is_same_template&lt; test_struct&lt;int&gt;, test_struct &gt;::value &lt;&lt; &quot;\n&quot;;
    std::cout &lt;&lt; test::is_same_template&lt; test_struct2&lt;int,int&gt;, test_struct &gt;::value &lt;&lt; &quot;\n&quot;;
    std::cout &lt;&lt; test::is_same_template&lt; test_struct&lt;int&gt;, test_struct2 &gt;::value &lt;&lt; &quot;\n&quot;;
    std::cout &lt;&lt; test::is_same_template&lt; test_struct2&lt;int, int&gt;, test_struct2 &gt;::value &lt;&lt; &quot;\n&quot;;

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/321619/template-in-liste-suchen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Jul 2026 15:04:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321619.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Nov 2013 21:06:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template in Liste suchen on Mon, 18 Nov 2013 21:06:22 GMT]]></title><description><![CDATA[<p>Hallo da!<br />
Abends spiele ich ja gerne mal mit templates herum, nun wollte ich schauen, ob ich herausfinden kann, ob ein Typ ein bestimmtes Template ist.<br />
Bevor ich den Code poste, hier schon einmal die Frage: Geht das nicht auch irgendwie einfacher?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

namespace test {

    template&lt; typename... T &gt;
    struct type_list {};

    template&lt; template&lt; typename... &gt; class Template, typename... Arguments &gt;
    type_list&lt;Arguments...&gt; deduce_template_arguments(Template&lt;Arguments...&gt;*);

    template&lt; typename T &gt;
    type_list&lt;&gt; deduce_template_arguments(T*);

    template&lt; typename T &gt;
    struct foo {
        using type = void;
    };

    template&lt; typename Instance, typename ArgList, template&lt; typename... &gt; class Template, typename EnableIf = void &gt;
    struct is_same_template_intern : public std::false_type
    {};

    template&lt; typename Instance, typename... Args, template&lt; typename... &gt; class Template &gt;
    struct is_same_template_intern&lt;Instance, type_list&lt;Args...&gt;, Template, typename foo&lt;Template&lt;Args...&gt;&gt;::type &gt;
    : public std::conditional&lt; std::is_same&lt; Instance, Template&lt;Args...&gt; &gt;::value, std::true_type, std::false_type &gt;::type
    {};

    template&lt; typename Instance, template&lt; typename... &gt; class Template &gt;
    struct is_same_template : public is_same_template_intern&lt; Instance, decltype(deduce_template_arguments((Instance*)nullptr)), Template &gt;
    {};

}

template&lt; typename T &gt;
struct test_struct {
};

template&lt; typename T1, typename T2 &gt;
struct test_struct2 {
};

int main()
{
    std::cout &lt;&lt; test::is_same_template&lt; test_struct&lt;int&gt;, test_struct &gt;::value &lt;&lt; &quot;\n&quot;;
    std::cout &lt;&lt; test::is_same_template&lt; test_struct2&lt;int,int&gt;, test_struct &gt;::value &lt;&lt; &quot;\n&quot;;
    std::cout &lt;&lt; test::is_same_template&lt; test_struct&lt;int&gt;, test_struct2 &gt;::value &lt;&lt; &quot;\n&quot;;
    std::cout &lt;&lt; test::is_same_template&lt; test_struct2&lt;int, int&gt;, test_struct2 &gt;::value &lt;&lt; &quot;\n&quot;;

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2366261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2366261</guid><dc:creator><![CDATA[EinerVonUns]]></dc:creator><pubDate>Mon, 18 Nov 2013 21:06:22 GMT</pubDate></item><item><title><![CDATA[Reply to Template in Liste suchen on Mon, 18 Nov 2013 22:27:46 GMT]]></title><description><![CDATA[<blockquote>
<p>ob ein Typ ein bestimmtes Template ist.</p>
</blockquote>
<p>Du meinst, ob ein Typ eine Spezialisierung eines Templates ist. Das geht so:</p>
<pre><code>#include &lt;iostream&gt;

template&lt;typename T, template&lt;typename...&gt; class C&gt;
struct is_specialization : std::false_type {};
template&lt;template&lt;typename...&gt; class C, typename... Args&gt;
struct is_specialization&lt;C&lt;Args...&gt;, C&gt; : std::true_type {};

template&lt; typename T &gt;
struct test_struct{};

template&lt; typename T1, typename T2 &gt;
struct test_struct2 {};

int main()
{
	static_assert(  is_specialization&lt;test_struct&lt;int&gt;, test_struct&gt;::value, &quot;&quot; );
	static_assert( !is_specialization&lt;test_struct2&lt;int, int&gt;, test_struct&gt;::value, &quot;&quot; );
	static_assert( !is_specialization&lt;test_struct&lt;int&gt;, test_struct2&gt;::value, &quot;&quot; );
	static_assert(  is_specialization&lt;test_struct2&lt;int, int&gt;, test_struct2&gt;::value, &quot;&quot; );
}
</code></pre>
<p>Allerdings ist das eine recht sinnlose Angelegenheit, da Templates drei verschiedene Arten von Parametern haben können, und das in allen Kombinationen. Daher lässt sich ein allgemeines Template dafür nicht schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2366268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2366268</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 18 Nov 2013 22:27:46 GMT</pubDate></item><item><title><![CDATA[Reply to Template in Liste suchen on Mon, 18 Nov 2013 22:43:53 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

namespace test { 

     struct yes_type { static const bool value = true; };
     struct no_type { static const bool value = false; };

     template&lt;template&lt;typename...&gt; class Template, typename... Arguments&gt;
     yes_type is_same_template_impl(Template&lt;Arguments...&gt;*);

     template&lt;template&lt;typename...&gt; class Template&gt;
     no_type is_same_template_impl(...);

     template&lt;typename Instance, template&lt; typename... &gt; class Template&gt;
     struct is_same_template : public decltype(is_same_template_impl&lt;Template&gt;((Instance*)0))
     {};       
} 

template&lt; typename T &gt; 
struct test_struct { 
}; 

template&lt; typename T1, typename T2 &gt; 
struct test_struct2 { 
}; 

int main() 
{ 
     std::cout &lt;&lt; test::is_same_template&lt; test_struct&lt;int&gt;, test_struct &gt;::value &lt;&lt; &quot;\n&quot;; 
     std::cout &lt;&lt; test::is_same_template&lt; test_struct2&lt;int,int&gt;, test_struct &gt;::value &lt;&lt; &quot;\n&quot;; 
     std::cout &lt;&lt; test::is_same_template&lt; test_struct&lt;int&gt;, test_struct2 &gt;::value &lt;&lt; &quot;\n&quot;; 
     std::cout &lt;&lt; test::is_same_template&lt; test_struct2&lt;int, int&gt;, test_struct2 &gt;::value &lt;&lt; &quot;\n&quot;; 
     std::cout &lt;&lt; test::is_same_template&lt; int, test_struct2 &gt;::value &lt;&lt; &quot;\n&quot;; 

     return 0; 
}
</code></pre>
<p>ARGH. Arcoth war schneller und hat auch noch die elegantere Lösung.<br />
Naja, ich tröste mich damit dass ich kaum TMP mache, speziell mit C++ 11 nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2366270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2366270</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 18 Nov 2013 22:43:53 GMT</pubDate></item><item><title><![CDATA[Reply to Template in Liste suchen on Mon, 18 Nov 2013 23:49:55 GMT]]></title><description><![CDATA[<p>Wahhhh, ich war der Meinung ich hätte das ausprobiert und der Compiler mochte nicht <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=":/"
      alt="😕"
    /> Oder hatte ich die Regel von gestern angewandt, obwohl hier gar kein Literal involviert ist? hrmmm.<br />
Danke, das ist natürlich viel eleganter!</p>
<p>Ich brauch das nicht im Allgemeinen funktionabel, ich bastel mir hier nur gerade Options-Listen für Templates zusammen und in diese Liste klatscht man dann Options-Templates.</p>
<pre><code class="language-cpp">some_template&lt; Foo, list&lt;some_option&lt;Arg1, Arg2&gt;, other_option&lt;Arg3&gt;&gt; &gt; foo;
</code></pre>
<p>Das some_template-Template fischt sich dann einfach die Argumente aus der Options-Liste &quot;get_nth_arg&lt; List, some_option, 2, default_type&gt;&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2366277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2366277</guid><dc:creator><![CDATA[EinerVonUns]]></dc:creator><pubDate>Mon, 18 Nov 2013 23:49:55 GMT</pubDate></item></channel></rss>