{"id":4989,"date":"2016-10-18T06:14:32","date_gmt":"2016-10-18T06:14:32","guid":{"rendered":"https:\/\/www.modernescpp.com\/index.php\/check-types\/"},"modified":"2023-06-26T12:38:55","modified_gmt":"2023-06-26T12:38:55","slug":"check-types","status":"publish","type":"post","link":"https:\/\/www.modernescpp.com\/index.php\/check-types\/","title":{"rendered":"Check Types"},"content":{"rendered":"<p>Template Metaprogramming is programming at compile time. But what has template metaprogramming in common with the type-traits library? A lot! The type-traits library is pure template metaprogramming, tamed in a library. With this post, my presentation of the type-traits library becomes more structured.<\/p>\n<p><!--more--><\/p>\n<h2>Check type properties<\/h2>\n<p>The type-trait library supports primary and composite type categories. You get the answer with the attribute <span style=\"font-family: courier new,courier;\">value<\/span>.&nbsp;<\/p>\n<h3>Primary type categories<\/h3>\n<p>C++ has 14 primary type categories. They are complete and orthogonal. This means that each type is exactly a member of one type category. The check for the type categories is independent of the type qualifiers <span style=\"font-family: courier new,courier;\">const<\/span> or <span style=\"font-family: courier new,courier;\">volatile<\/span>. &nbsp;<\/p>\n<p>The 14 primary type categories:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff; overflow: auto; width: auto; gray;border-width: .1em .1em .1em .8em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_void;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_integral;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_floating_point;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_array;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_pointer;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_reference;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_member_object_pointer;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_member_function_pointer;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_enum;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_union;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_class;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_function;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_lvalue_reference;\r\n<span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_rvalue_reference;\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>And here is the application of the primary type categories:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff; overflow: auto; width: auto; gray;border-width: .1em .1em .1em .8em;\">\n<table>\n<tbody>\n<tr>\n<td>\n<pre style=\"margin: 0; line-height: 125%;\"> 1\r\n 2\r\n 3\r\n 4\r\n 5\r\n 6\r\n 7\r\n 8\r\n 9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n32\r\n33\r\n34\r\n35\r\n36\r\n37\r\n38\r\n39\r\n40\r\n41<\/pre>\n<\/td>\n<td>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #008000;\">\/\/  primaryTypeCategories.cpp<\/span>\r\n\r\n<span style=\"color: #0000ff;\">#include &lt;iostream&gt;<\/span>\r\n<span style=\"color: #0000ff;\">#include &lt;type_traits&gt;<\/span>\r\n\r\n<span style=\"color: #0000ff;\">struct<\/span> A{\r\n  <span style=\"color: #2b91af;\">int<\/span> a;\r\n  <span style=\"color: #2b91af;\">int<\/span> f(<span style=\"color: #2b91af;\">int<\/span>){<span style=\"color: #0000ff;\">return<\/span> 2011;}\r\n};\r\n\r\n<span style=\"color: #0000ff;\">enum<\/span> E{\r\n  e= 1,\r\n};\r\n\r\n<span style=\"color: #0000ff;\">union<\/span> U{\r\n  <span style=\"color: #2b91af;\">int<\/span> u;\r\n};\r\n\r\n\r\n<span style=\"color: #2b91af;\">int<\/span> main(){\r\n  \r\n  std::cout &lt;&lt;  std::boolalpha &lt;&lt;  std::endl;\r\n\r\n  std::cout &lt;&lt; std::is_void&lt;<span style=\"color: #2b91af;\">void<\/span>&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_integral&lt;<span style=\"color: #2b91af;\">short<\/span>&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_floating_point&lt;<span style=\"color: #2b91af;\">double<\/span>&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_array&lt;<span style=\"color: #2b91af;\">int<\/span> [] &gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_pointer&lt;<span style=\"color: #2b91af;\">int<\/span>*&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_reference&lt;<span style=\"color: #2b91af;\">int<\/span>&amp;&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_member_object_pointer&lt;<span style=\"color: #2b91af;\">int<\/span> A::*&gt;::value &lt;&lt;  std::endl;\r\n  std::cout &lt;&lt; std::is_member_function_pointer&lt;<span style=\"color: #2b91af;\">int<\/span> (A::*)(<span style=\"color: #2b91af;\">int<\/span>)&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_enum&lt;E&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_union&lt;U&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_class&lt;std::string&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_function&lt;<span style=\"color: #2b91af;\">int<\/span> * (<span style=\"color: #2b91af;\">double<\/span>)&gt;::value &lt;&lt; std::endl;\t\r\n  std::cout &lt;&lt; std::is_lvalue_reference&lt;<span style=\"color: #2b91af;\">int<\/span>&amp;&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; std::is_rvalue_reference&lt;<span style=\"color: #2b91af;\">int<\/span>&amp;&amp;&gt;::value &lt;&lt; std::endl;\r\n  \r\n  std::cout &lt;&lt;  std::endl;\r\n\r\n}\t\r\n<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><span style=\"text-decoration: underline;\"><span style=\"text-decoration: underline;\"> <!-- HTML generated using hilite.me --><\/span><\/span><\/p>\n<p>Thanks to the use of the flag <span style=\"font-family: courier new,courier;\">std::boolalpha<\/span> in line 22, the program displays <span style=\"font-family: courier new,courier;\">true<\/span> or <span style=\"font-family: courier new,courier;\">false <\/span>instead of 1 or 0. Each call of the 14 primary type categories returns true.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-4986\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/10\/primaryTypeCategories.png\" alt=\"primaryTypeCategories\" width=\"543\" height=\"381\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/10\/primaryTypeCategories.png 543w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/10\/primaryTypeCategories-300x210.png 300w\" sizes=\"auto, (max-width: 543px) 100vw, 543px\" \/><\/p>\n<h3>How does the magic work?<\/h3>\n<p>The technique&#8217;s key is based on templates and template specialization, a few conventions, and a lot of typing. I wrote a possible implementation of the function template <span style=\"font-family: courier new,courier;\">std::integral. std::integra<\/span>l will check if the type is integral.<\/p>\n<p>&nbsp;<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff; overflow: auto; width: auto; gray;border-width: .1em .1em .1em .8em;\">\n<table>\n<tbody>\n<tr>\n<td>\n<pre style=\"margin: 0; line-height: 125%;\"> 1\r\n 2\r\n 3\r\n 4\r\n 5\r\n 6\r\n 7\r\n 8\r\n 9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n32\r\n33\r\n34\r\n35\r\n36\r\n37\r\n38\r\n39\r\n40\r\n41\r\n42\r\n43\r\n44\r\n45\r\n46\r\n47\r\n48\r\n49\r\n50\r\n51\r\n52\r\n53\r\n54\r\n55\r\n56\r\n57\r\n58\r\n59\r\n60\r\n61\r\n62\r\n63\r\n64\r\n65\r\n66\r\n67\r\n68\r\n69\r\n70\r\n71\r\n72\r\n73\r\n74\r\n75\r\n76\r\n77\r\n78\r\n79\r\n80\r\n81\r\n82\r\n83\r\n84\r\n85\r\n86\r\n87\r\n88\r\n89\r\n90\r\n91\r\n92<\/pre>\n<\/td>\n<td>\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #008000;\">\/\/ integral.cpp<\/span>\r\n\r\n<span style=\"color: #0000ff;\">#include &lt;iostream&gt;<\/span>\r\n<span style=\"color: #0000ff;\">#include &lt;type_traits&gt;<\/span>\r\n\r\n<span style=\"color: #0000ff;\">namespace<\/span> rgr{\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span>&lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>, T v&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> integral_constant {\r\n      <span style=\"color: #0000ff;\">static<\/span> constexpr T value = v;\r\n      <span style=\"color: #0000ff;\">typedef<\/span> T value_type;\r\n      <span style=\"color: #0000ff;\">typedef<\/span> integral_constant type;\r\n      constexpr <span style=\"color: #0000ff;\">operator<\/span> value_type() <span style=\"color: #0000ff;\">const<\/span> noexcept { <span style=\"color: #0000ff;\">return<\/span> value; }\r\n      constexpr value_type <span style=\"color: #0000ff;\">operator<\/span>()() <span style=\"color: #0000ff;\">const<\/span> noexcept { <span style=\"color: #0000ff;\">return<\/span> value; } <span style=\"color: #008000;\">\/\/since c++14<\/span>\r\n  };\r\n\r\n  <span style=\"color: #0000ff;\">typedef<\/span> integral_constant&lt;<span style=\"color: #2b91af;\">bool<\/span>, true&gt; true_type;\r\n  <span style=\"color: #0000ff;\">typedef<\/span> integral_constant&lt;<span style=\"color: #2b91af;\">bool<\/span>, false&gt; false_type;\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral : <span style=\"color: #0000ff;\">public<\/span> false_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">bool<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">char<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">signed<\/span> <span style=\"color: #2b91af;\">char<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">unsigned<\/span> <span style=\"color: #2b91af;\">char<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">wchar_t<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">short<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">int<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">long<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">long<\/span> <span style=\"color: #2b91af;\">long<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">unsigned<\/span> <span style=\"color: #2b91af;\">short<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">unsigned<\/span> <span style=\"color: #2b91af;\">int<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">unsigned<\/span> <span style=\"color: #2b91af;\">long<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n\r\n  <span style=\"color: #0000ff;\">template<\/span> &lt;&gt;\r\n  <span style=\"color: #0000ff;\">struct<\/span> is_integral&lt;<span style=\"color: #2b91af;\">unsigned<\/span> <span style=\"color: #2b91af;\">long<\/span> <span style=\"color: #2b91af;\">long<\/span>&gt; : <span style=\"color: #0000ff;\">public<\/span> true_type{};\r\n  \r\n}\r\n\r\n<span style=\"color: #2b91af;\">int<\/span> main(){\r\n  \r\n  std::cout &lt;&lt; std::boolalpha &lt;&lt; std::endl;\r\n  \r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"std::is_integral&lt;int&gt;::value: \"<\/span> &lt;&lt; std::is_integral&lt;<span style=\"color: #2b91af;\">int<\/span>&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"rgr::is_integral&lt;int&gt;::value: \"<\/span> &lt;&lt; rgr::is_integral&lt;<span style=\"color: #2b91af;\">int<\/span>&gt;::value &lt;&lt; std::endl;\r\n  \r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"std::is_integral&lt;double&gt;::value: \"<\/span> &lt;&lt; std::is_integral&lt;<span style=\"color: #2b91af;\">double<\/span>&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"rgr::is_integral&lt;double&gt;::value: \"<\/span> &lt;&lt; rgr::is_integral&lt;<span style=\"color: #2b91af;\">double<\/span>&gt;::value &lt;&lt; std::endl;\r\n  \r\n  std::cout &lt;&lt; std::endl;\r\n  \r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"std::true_type::value: \"<\/span> &lt;&lt; std::true_type::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"rgr::true_type::value: \"<\/span> &lt;&lt; rgr::true_type::value &lt;&lt; std::endl;\r\n  \r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"std::false_type::value: \"<\/span> &lt;&lt; std::false_type::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"rgr::false_type::value: \"<\/span> &lt;&lt; rgr::false_type::value &lt;&lt; std::endl;\r\n  \r\n  std::cout &lt;&lt; std::endl;\r\n  \r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"std::integral_constant&lt;bool, true&gt;::value: \"<\/span> &lt;&lt; std::integral_constant&lt;<span style=\"color: #2b91af;\">bool<\/span>, true&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"rgr::integral_constant&lt;bool, true&gt;::value: \"<\/span> &lt;&lt; rgr::integral_constant&lt;<span style=\"color: #2b91af;\">bool<\/span>, true&gt;::value &lt;&lt; std::endl;\r\n  \r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"std::integral_constant&lt;bool, false&gt;::value: \"<\/span> &lt;&lt; std::integral_constant&lt;<span style=\"color: #2b91af;\">bool<\/span>, false&gt;::value &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; <span style=\"color: #a31515;\">\"rgr::integral_constant&lt;bool, false&gt;::value: \"<\/span> &lt;&lt; rgr::integral_constant&lt;<span style=\"color: #2b91af;\">bool<\/span>, false&gt;::value &lt;&lt; std::endl;  \r\n  \r\n  std::cout &lt;&lt; std::endl;\r\n  \r\n}\r\n<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>&nbsp;<\/p>\n<p>I use in my implementation the namespace <span style=\"font-family: courier new,courier;\">rgr<\/span> and compare my implementation with type-traits implementation in the namespace<span style=\"font-family: courier new,courier;\"> std<\/span>. The invocation of the function template&nbsp;<span style=\"font-family: courier new,courier;\"><span style=\"font-family: arial,helvetica,sans-serif;\"><span style=\"font-family: courier new,courier;\">rgr::is_integral&lt;int&gt;::value (<span style=\"font-family: arial,helvetica,sans-serif;\">line 69) causes under the hood the invocation of the expression <\/span><span style=\"font-family: arial,helvetica,sans-serif;\"><\/span>rgr::true_type::value <span style=\"font-family: arial,helvetica,sans-serif;\">(line 77) because <\/span>integral&lt;int&gt; <span style=\"font-family: arial,helvetica,sans-serif;\">is derived from<\/span> true_type <span style=\"font-family: arial,helvetica,sans-serif;\">(line 42)<\/span>. rgr::true_type::value <span style=\"font-family: arial,helvetica,sans-serif;\">is an alias for<\/span> rgr::integral_constant&lt;bool, true&gt;::value <\/span> <\/span> <\/span><span style=\"font-family: arial,helvetica,sans-serif;\">(line 17). I use only in the example&nbsp;the<span style=\"font-family: courier new,courier;\"> static constexpr<\/span> <span style=\"font-family: courier new,courier;\">value<\/span> of the class <span style=\"font-family: courier new,courier;\">integral_constant. integral_constant<\/span> is the base class of the type-traits functions. <\/span><span style=\"font-family: courier new,courier;\"><span style=\"font-family: arial,helvetica,sans-serif;\"><span style=\"font-family: courier new,courier;\"><span style=\"font-family: arial,helvetica,sans-serif;\"><br \/><\/span> <\/span> <\/span> <\/span><\/p>\n<p>For completeness, the output of the program. My implementation behaves like the type-traits library.<\/p>\n<p>&nbsp;<img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-4987\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/10\/integral.png\" alt=\"integral\" width=\"632\" height=\"372\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/10\/integral.png 632w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/10\/integral-300x177.png 300w\" sizes=\"auto, (max-width: 632px) 100vw, 632px\" \/><\/p>\n<p>Based on the 14 primary type categories, there are seven composite type categories in C++.<\/p>\n<\/p>\n<h3>Composite type categories<\/h3>\n<p>&nbsp;<br \/><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-4988\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/10\/CompositeTypeCategories.png\" alt=\"CompositeTypeCategories\" width=\"700\" height=\"535\" style=\"margin: 15px;\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/10\/CompositeTypeCategories.png 915w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/10\/CompositeTypeCategories-300x229.png 300w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/10\/CompositeTypeCategories-768x587.png 768w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>The <span style=\"font-family: courier new,courier;\">is_fundamental<\/span> type category uses the function template <span style=\"font-family: courier new,courier;\">is_same.<\/span> More about I in the next post, in which I will write about type comparisons with the type-traits library.<\/p>\n<p>There are more type checks possible with the type-traits.<\/p>\n<h3>Type properties<\/h3>\n<p>In addition to the primary and composite type categories, you can check the type properties.&nbsp;<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff; overflow: auto; width: auto; gray;border-width: .1em .1em .1em .8em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #0000ff;\">    template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_const;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_volatile;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_trivial;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_trivially_copyable;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_standard_layout;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_pod;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_literal_type;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_empty;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_polymorphic;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_abstract;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_signed;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_unsigned;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>, class... Args&gt; <span style=\"color: #0000ff;\">struct<\/span> is_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_default_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_copy_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_move_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>, <span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">U<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_assignable;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_copy_assignable;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_move_assignable;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_destructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>, class... Args&gt; <span style=\"color: #0000ff;\">struct<\/span> is_trivially_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_trivially_default_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_trivially_copy_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_trivially_move_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>, <span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">U<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_trivially_assignable;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_trivially_copy_assignable;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_trivially_move_assignable;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_trivially_destructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>, class... Args&gt; <span style=\"color: #0000ff;\">struct<\/span> is_nothrow_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_nothrow_default_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_nothrow_copy_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_nothrow_move_constructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>, <span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">U<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_nothrow_assignable;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_nothrow_copy_assignable;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_nothrow_move_assignable;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> is_nothrow_destructible;\r\n    <span style=\"color: #0000ff;\">template<\/span> &lt;<span style=\"color: #0000ff;\">class<\/span> <span style=\"color: #2b91af;\">T<\/span>&gt; <span style=\"color: #0000ff;\">struct<\/span> has_virtual_destructor;\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Many of the function templates like is_trivially_copyable, have the name component trivially. That means these methods must be generated by the compiler and not by the developer. A method you explicitly request from the compiler with the keyword <span style=\"font-family: courier new,courier;\">default<\/span> is also trivial.<\/p>\n<p>&nbsp;<\/p>\n<h2>What&#8217;s next?<\/h2>\n<p>The type-traits library has a lot to offer. I will write in the <a href=\"https:\/\/www.modernescpp.com\/index.php\/compare-and-modify-types\">next post<\/a> about type comparison and type modifications at compile time.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Template Metaprogramming is programming at compile time. But what has template metaprogramming in common with the type-traits library? A lot! The type-traits library is pure template metaprogramming, tamed in a library. With this post, my presentation of the type-traits library becomes more structured.<\/p>\n","protected":false},"author":21,"featured_media":4986,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[364],"tags":[419],"class_list":["post-4989","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-embedded","tag-type-traits"],"_links":{"self":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/4989","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/comments?post=4989"}],"version-history":[{"count":1,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/4989\/revisions"}],"predecessor-version":[{"id":6935,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/4989\/revisions\/6935"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media\/4986"}],"wp:attachment":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media?parent=4989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/categories?post=4989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/tags?post=4989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}