type_traits.h.xml 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <chapter xml:id="type_traits.h">
  2. <title><tt>__vic/type_traits.h</tt></title>
  3. <p>Поддержка метапрограммирования с помощью шаблонов.</p>
  4. <p>Все метафункции-предикаты имеют член в виде булевой статической константы
  5. по имени <tt>value</tt> и, как правило, порождены от
  6. <tt>integral_constant</tt>.</p>
  7. <p>Все метафункции-преобразователи типов имеют член-тип по имени <tt>type</tt>,
  8. являющийся результатом преобразования.</p>
  9. <p>Все шаблонные псевдонимы доступны только в режиме C++11.</p>
  10. <chapter xml:id="integral_constant">
  11. <title><tt>integral_constant</tt></title>
  12. <code-block lang="C++"><![CDATA[
  13. template<class T, T Val>
  14. struct integral_constant
  15. {
  16. using value_type = T;
  17. using type = integral_constant<T, Val>;
  18. static constexpr T value = Val;
  19. };
  20. ]]></code-block>
  21. <p>Базовый класс большиства метафункций с <tt>value</tt>.</p>
  22. </chapter>
  23. <chapter xml:id="true_type">
  24. <title><tt>true_type</tt></title>
  25. <code-block lang="C++"><![CDATA[
  26. using true_type = integral_constant<bool, true>;
  27. ]]></code-block>
  28. <p>Базовый класс метафункций-предикатов со значением <tt>true</tt>.</p>
  29. </chapter>
  30. <chapter xml:id="false_type">
  31. <title><tt>false_type</tt></title>
  32. <code-block lang="C++"><![CDATA[
  33. using false_type = integral_constant<bool, false>;
  34. ]]></code-block>
  35. <p>Базовый класс метафункций-предикатов со значением <tt>false</tt>.</p>
  36. </chapter>
  37. <chapter xml:id="is_same">
  38. <title><tt>is_same</tt></title>
  39. <code-block lang="C++"><![CDATA[
  40. template<class T1, class T2> struct is_same;
  41. ]]></code-block>
  42. <p>Предикат. Истинен, если <tt>T1</tt> и <tt>T2</tt> - это в точности один и
  43. тот же тип.</p>
  44. </chapter>
  45. <chapter xml:id="is_const">
  46. <title><tt>is_const</tt></title>
  47. <code-block lang="C++"><![CDATA[
  48. template<class T> struct is_const;
  49. ]]></code-block>
  50. <p>Предикат. Истинен, если <tt>T</tt> имеет квалификатор <tt>const</tt>.</p>
  51. </chapter>
  52. <chapter xml:id="is_signed_integer">
  53. <title><tt>is_signed_integer</tt></title>
  54. <code-block lang="C++"><![CDATA[
  55. template<class T> struct is_signed_integer;
  56. ]]></code-block>
  57. <p>Предикат. Истинен, если <tt>T</tt> - «стандартный целый тип со знаком»
  58. (см. Стандарт).</p>
  59. </chapter>
  60. <chapter xml:id="is_unsigned_integer">
  61. <title><tt>is_unsigned_integer</tt></title>
  62. <code-block lang="C++"><![CDATA[
  63. template<class T> struct is_unsigned_integer;
  64. ]]></code-block>
  65. <p>Предикат. Истинен, если <tt>T</tt> - «стандартный целый беззнаковый тип»
  66. (см. Стандарт).</p>
  67. </chapter>
  68. <chapter xml:id="conjunction">
  69. <title><tt>conjunction</tt> <sign>C++11</sign></title>
  70. <code-block lang="C++"><![CDATA[
  71. template<class... B> struct conjunction;
  72. ]]></code-block>
  73. <p>Предикат. Конъюнкция предикатов <tt>B...</tt>. Ложен тогда и только тогда,
  74. когда ложен один из <tt>B...</tt>.</p>
  75. </chapter>
  76. <chapter xml:id="disjunction">
  77. <title><tt>disjunction</tt> <sign>C++11</sign></title>
  78. <code-block lang="C++"><![CDATA[
  79. template<class... B> struct disjunction;
  80. ]]></code-block>
  81. <p>Предикат. Дизъюнкция предикатов <tt>B...</tt>. Истинен тогда и только тогда,
  82. когда истинен один из <tt>B...</tt>.</p>
  83. </chapter>
  84. <chapter xml:id="negation">
  85. <title><tt>negation</tt></title>
  86. <code-block lang="C++"><![CDATA[
  87. template<class B> struct negation;
  88. ]]></code-block>
  89. <p>Предикат. Логическое отрицание предиката <tt>B</tt>.</p>
  90. </chapter>
  91. <chapter xml:id="remove_const">
  92. <title><tt>remove_const</tt></title>
  93. <code-block lang="C++"><![CDATA[
  94. template<class T> struct remove_const;
  95. template<class T> using remove_const_t = typename remove_const<T>::type;
  96. ]]></code-block>
  97. <p>Преобразователь типа. Удаляет у типа самый верхний квалификатор
  98. <tt>const</tt>, либо просто возвращает <tt>T</tt>, если такого квалификатора
  99. нет.</p>
  100. </chapter>
  101. <chapter xml:id="remove_volatile">
  102. <title><tt>remove_volatile</tt></title>
  103. <code-block lang="C++"><![CDATA[
  104. template<class T> struct remove_volatile;
  105. template<class T> using remove_volatile_t = typename remove_volatile<T>::type;
  106. ]]></code-block>
  107. <p>Преобразователь типа. Удаляет у типа самый верхний квалификатор
  108. <tt>volatile</tt>, либо просто возвращает <tt>T</tt>, если такого квалификатора
  109. нет.</p>
  110. </chapter>
  111. <chapter xml:id="remove_cv">
  112. <title><tt>remove_cv</tt></title>
  113. <code-block lang="C++"><![CDATA[
  114. template<class T> struct remove_cv;
  115. template<class T> using remove_cv_t = typename remove_cv<T>::type;
  116. ]]></code-block>
  117. <p>Преобразователь типа. Удаляет у типа самые верхние квалификаторы
  118. <tt>const</tt> и/или <tt>volatile</tt>, либо просто возвращает <tt>T</tt>,
  119. если таких квалификаторов нет.</p>
  120. </chapter>
  121. <chapter xml:id="remove_reference">
  122. <title><tt>remove_reference</tt></title>
  123. <code-block lang="C++"><![CDATA[
  124. template<class T> struct remove_reference;
  125. template<class T> using remove_reference_t = typename remove_reference<T>::type;
  126. ]]></code-block>
  127. <p>Преобразователь типа. Возвращает тип, на который ссылается <tt>T</tt>, либо
  128. просто возвращает <tt>T</tt>, если он не является ссылкой.</p>
  129. </chapter>
  130. <chapter xml:id="remove_cvref">
  131. <title><tt>remove_cvref</tt></title>
  132. <code-block lang="C++"><![CDATA[
  133. template<class T> struct remove_cvref;
  134. template<class T> using remove_cvref_t = typename remove_cvref<T>::type;
  135. ]]></code-block>
  136. <p>Преобразователь типа. Применяет <tt>remove_reference</tt>, затем
  137. <tt>remove_cv</tt> к <tt>T</tt>.</p>
  138. </chapter>
  139. <chapter xml:id="remove_pointer">
  140. <title><tt>remove_pointer</tt></title>
  141. <code-block lang="C++"><![CDATA[
  142. template<class T> struct remove_pointer;
  143. template<class T> using remove_pointer_t = typename remove_pointer<T>::type;
  144. ]]></code-block>
  145. <p>Преобразователь типа. Возвращает тип, на который указывает <tt>T</tt>, либо
  146. просто возвращает <tt>T</tt>, если он не является указателем.</p>
  147. </chapter>
  148. <chapter xml:id="conditional">
  149. <title><tt>conditional</tt></title>
  150. <code-block lang="C++"><![CDATA[
  151. template<bool Cond, class Then, class Else> struct conditional;
  152. template<bool Cond, class Then, class Else>
  153. using conditional_t = typename conditional<Cond, Then, Else>;
  154. ]]></code-block>
  155. <p>Преобразователь типа. Возвращает <tt>Then</tt>, если <tt>Cond == true</tt>.
  156. В противном случае - <tt>Else</tt>.</p>
  157. </chapter>
  158. <chapter xml:id="enable_if">
  159. <title><tt>enable_if</tt>, <tt>disable_if</tt></title>
  160. <code-block lang="C++"><![CDATA[
  161. template<bool Test, class T = void>
  162. struct enable_if
  163. {
  164. using type = T;
  165. };
  166. template<class T>
  167. struct enable_if<false, T> {};
  168. template<bool Test, class T = void>
  169. struct disable_if : enable_if<!Test, T> {};
  170. ]]></code-block>
  171. <p>Классические инструменты для фокусов со SFINAE.</p>
  172. </chapter>
  173. <chapter xml:id="index_sequence">
  174. <title><tt>index_sequence</tt>, <tt>make_index_sequence</tt> <sign>C++11</sign></title>
  175. <code-block lang="C++"><![CDATA[
  176. template<size_t... I>
  177. struct index_sequence
  178. {
  179. static constexpr size_t size() { return sizeof...(I); }
  180. };
  181. template<size_t Size>
  182. using make_index_sequence = index_sequence<0, 1, ..., Size-1>;
  183. ]]></code-block>
  184. <p>Реализация <tt>std::index_sequence</tt> из C++14 для C++11.</p>
  185. <note>В отличие от <tt>std::index_sequence</tt>, не является специализацией
  186. какого-то аналога <tt>std::integer_sequence</tt>.</note>
  187. </chapter>
  188. </chapter>