{"id":3337,"date":"2018-01-23T16:39:21","date_gmt":"2018-01-23T15:39:21","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3337"},"modified":"2019-01-04T16:20:08","modified_gmt":"2019-01-04T15:20:08","slug":"c-guns-c17-class-template-argument-deduction-user-guide","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3337","title":{"rendered":"C++ Guns - C++17 class template argument deduction user guide"},"content":{"rendered":"<p>Es ist ja bekannt, dass der Compiler die Template Parameter von Funktionen selbst bestimmen kann. <\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ntemplate&lt;typename T&gt;\r\nT func(T val) {\r\n  return val;\r\n}\r\n\r\nauto i = func(1); \/\/ i int\r\n<\/pre>\n<p>Seit C++17 funktioniert das nun auch mit Klassen. Das Feature hierf\u00fcr nennt sich __cpp_deduction_guides und wird seit GCC 7 unterst\u00fctzt.<br \/>\n<a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/class_template_argument_deduction\">https:\/\/en.cppreference.com\/w\/cpp\/language\/class_template_argument_deduction<\/a><br \/>\nMehr noch, es k\u00f6nnen User Guides angegeben werden. Mit denen wird festgelegt, wie genau sich der Type der Klasse ableiten soll.<br \/>\nHier ein einfaches Beispiel:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n#include &lt;type_traits&gt;\r\n\r\n#ifndef __cpp_deduction_guides\r\n#error &quot;need gcc 7&quot;\r\n#endif\r\n\r\ntemplate&lt;class T&gt;\r\nstruct A {\r\n    using value_type = T;\r\n\r\n    template&lt;typename U, typename V&gt;\r\n    constexpr A(U, V) {\r\n    }\r\n};\r\n\r\n\/\/ Das ist der  class template argument deduction user guide\r\n\/\/ Der gemeinsame Type von U und V soll T von der Klasse A sein.\r\ntemplate&lt;typename U, typename V&gt;\r\nA(U, V) -&gt; A&lt;std::common_type_t&lt;U, V&gt;&gt;;\r\n\r\n\r\nconstexpr A x(1, 2.0);\r\n\/\/ Der gemeinsame Type von int und double ist double\r\n\/\/ Zur Compilezeit getestet!\r\nstatic_assert(std::is_same_v&lt;decltype(x)::value_type, double&gt;);\r\n\/\/ yeah\r\n<\/pre>\n<p>Sehr geiles feature.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es ist ja bekannt, dass der Compiler die Template Parameter von Funktionen selbst bestimmen kann. template&lt;typename T&gt; T func(T val) { return val; } auto i = func(1); \/\/ i int Seit C++17 funktioniert das nun auch mit Klassen. Das Feature hierf\u00fcr nennt sich __cpp_deduction_guides und wird seit GCC 7 unterst\u00fctzt. https:\/\/en.cppreference.com\/w\/cpp\/language\/class_template_argument_deduction Mehr noch, es [&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-3337","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\/3337","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=3337"}],"version-history":[{"count":4,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3337\/revisions"}],"predecessor-version":[{"id":3952,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3337\/revisions\/3952"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3337"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}