{"id":3951,"date":"2019-01-04T17:16:24","date_gmt":"2019-01-04T16:16:24","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3951"},"modified":"2019-01-04T17:16:24","modified_gmt":"2019-01-04T16:16:24","slug":"c-guns-rekursive-template-datentypen","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3951","title":{"rendered":"C++ Guns: Rekursive Template Datentypen"},"content":{"rendered":"<p>Schonmal probiert den ein und selben template Datentypen mit sich selbst zu nutzen? Mach nichts, ich auch nicht ;)<\/p>\n<p>Als erstes Beispiel ein einfacher, nicht rekursiver Datentyp:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ntemplate&lt;typename T&gt;\r\nstruct Test {\t\r\n\tT x;\r\n};\r\n\r\nauto func() {\r\n   Test{0};\r\n}\r\n\r\nerror: class template argument deduction failed:\r\n    Test{0};\r\nerror: no matching function for call to 'Test(int)'\r\nnote: candidate: 'template&lt;class T&gt; Test(Test&lt;T&gt;)-&gt; Test&lt;T&gt;'\r\n<\/pre>\n<p>Seit C++17 gibt es <a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/class_template_argument_deduction\">Class template argument deduction<\/a>. Allerdings muss man f\u00fcr User-defined typen auch User-defined deduction guides angeben. Dieser hier ist sehr simpel.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ntemplate&lt;typename T&gt;\r\nTest(T) -&gt; Test&lt;T&gt;;\r\n<\/pre>\n<p>Damit compiliert das oben gezeigte Beispiel (ab GCC7).<br \/>\nUnd nun zu dem rekursiven Typen. Ob es geklappt hat, l\u00e4sst sich mit einem static_assert mit std::is_same zeigen.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ntemplate&lt;typename T&gt;\r\nauto func2(T) {\t\r\n    static_assert(std::is_same_v&lt;T, Test&lt;Test&lt;int&gt;&gt; &gt;);\r\n}\r\n\r\nauto func() {\r\n  func2( Test{Test{0}} ); \/\/ Dies ruft den Copy-Konstruktor auf\r\n}\r\n\r\nIn instantiation of 'auto func2(T) &#x5B;with T = Test&lt;int&gt;]':\r\nerror: static assertion failed\r\n<\/pre>\n<p>Nein es hat nicht geklappt. Der Grund hierf\u00fcr ist, dass wir ja eigentlich den Copy-Konstruktor aufgerufen haben. <\/p>\n<p>Mit den deduction guides k\u00f6nnen wir aber dem Compiler bessere Anweisungen geben.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ntemplate&lt;typename T&gt;\r\nTest(Test&lt;T&gt;) -&gt; Test&lt;Test&lt;T&gt;&gt;;\r\n<\/pre>\n<p>Damit compiliert der Code nun.<\/p>\n<p>Vielen Dank an Freundlich aus dem #c++ Chat f\u00fcr die Fragestellung ;)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Schonmal probiert den ein und selben template Datentypen mit sich selbst zu nutzen? Mach nichts, ich auch nicht ;) Als erstes Beispiel ein einfacher, nicht rekursiver Datentyp: template&lt;typename T&gt; struct Test { T x; }; auto func() { Test{0}; } error: class template argument deduction failed: Test{0}; error: no matching function for call to 'Test(int)' [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-3951","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3951","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3951"}],"version-history":[{"count":3,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3951\/revisions"}],"predecessor-version":[{"id":3955,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3951\/revisions\/3955"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3951"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3951"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}