{"id":220217,"date":"2014-04-21T14:19:02","date_gmt":"2014-04-21T10:19:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=220217"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=220217","title":{"rendered":"<span class=\"post_title\">TypeList \u0438 \u041a\u0440\u0435\u0441\u0442\u0438\u043a\u0438-\u043d\u043e\u043b\u0438\u043a\u0438<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u0417\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e(!), \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c <code>variadic templates<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a 10\u0439 \u0441\u0442\u0443\u0434\u0438\u0438, \u0433\u0434\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442\u0443. \u0410 \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u043b\u0433\u043e \u043d\u0435 \u0434\u0443\u043c\u0430\u0442\u044c, \u0433\u0434\u0435 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c variadic templates, \u043f\u0440\u0438\u0448\u043b\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c <a href=\"http:\/\/erdani.com\/\">Typelist<\/a>. \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435, \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430, \u0430 \u0442\u0435\u043c, \u043a\u043e\u043c\u0443 \u044d\u0442\u043e \u0441\u043a\u0443\u0447\u043d\u043e \u2014 \u043c\u043e\u0436\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043b\u0438\u0441\u0442\u0430\u0442\u044c \u0432\u043d\u0438\u0437 \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u043a\u0440\u0435\u0441\u0442\u0438\u043a\u043e\u0432-\u043d\u043e\u043b\u0438\u043a\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>Typelist<\/code>.<br \/>  \u0418\u0442\u0430\u043a, <code>TypeList<\/code>:<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">TypeList<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">namespace internal { struct Void { }; } \/\/ internal  template&lt;typename ...Args&gt; struct TypeList {     typedef internal::Void Head;     typedef internal::Void Tail; };  typedef TypeList&lt;&gt; EmptyTypeList;  template&lt;typename H, typename ...T&gt; struct TypeList&lt;H, T...&gt; {     typedef H Head;     typedef TypeList&lt;T...&gt; Tail; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 <code>TypeList<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u00ab\u0433\u043e\u043b\u043e\u0432\u0443\u00bb(<code>Head<\/code>) \u0438 \u00ab\u0445\u0432\u043e\u0441\u0442\u00bb(<code>Tail<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0442\u0438\u043f\u043e\u0432. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;float, double, long double&gt; floating_point_types; <\/code><\/pre>\n<p>  \u0420\u0430\u043d\u044c\u0448\u0435, \u0431\u0435\u0437 \u0421++11, \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0442\u0430\u043a:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0442\u0430\u0440\u044b\u0439 TypeList<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template &lt;class H, class T&gt; struct typelist {     typedef H head;     typedef T tail; };  typedef typelist&lt;float, typelist&lt;double, long double&gt; &gt; floating_point_types; <\/code><\/pre>\n<p>  \u0418 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0432 \u043f\u043e\u043c\u043e\u0449\u044c:  <\/p>\n<pre><code class=\"cpp\">#define TYPELIST_1(T1) typelist&lt;T1, null_typelist&gt; #define TYPELIST_2(T1, T2) typelist&lt;T1, TYPELIST_1(T2) &gt; #define TYPELIST_3(T1, T2, T3) typelist&lt;T1, TYPELIST_2(T2, T3) &gt; ... #define TYPELIST_50... <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f <code>variadic templates<\/code>, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0438 \u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u0438 \u043e\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435.<br \/>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0442\u0438\u043f\u043e\u0432, \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u043d\u0438\u043c \u0438 \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435(\u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u043a\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u0438\u0434\u0435\u043b <a href=\"http:\/\/en.wikipedia.org\/wiki\/Modern_C%2B%2B_Design\">Modern C++ Design<\/a> \u2014 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u2014 \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e 2001 \u0433\u043e\u0434!).<br \/>  \u0418\u0442\u0430\u043a, \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f <code>internal::Void<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043a\u0430\u043a \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u043f\u0443\u0441\u0442(\u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043b \u043d\u0438\u0447\u0435\u0433\u043e: <code>TypeList&lt;&gt;<\/code>, \u0438\u043b\u0438, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043e \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b). \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043d\u0430\u0447\u0430\u043b\u0430:  <\/p>\n<h4>IsEmpty<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">IsEmpty<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template&lt;typename TL&gt; struct IsEmpty :     std::true_type { };  template&lt;&gt; struct IsEmpty&lt;TypeList&lt;internal::Void, internal::Void&gt;&gt; :     std::true_type { };  template&lt;typename ...Args&gt; struct IsEmpty&lt;TypeList&lt;Args...&gt;&gt; :     std::integral_constant&lt;bool,         std::is_same&lt;typename TypeList&lt;Args...&gt;::Head, internal::Void&gt;::value &&         IsEmpty&lt;typename TypeList&lt;Args...&gt;::Tail&gt;::value&gt; { }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u043d\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u00ab\u043a\u043e\u0441\u0442\u044f\u043a\u00bb: \u0442\u0438\u043f <code>IsEmpty<\/code> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d \u043e\u0434\u043d\u0438\u043c \u0442\u0438\u043f\u043e\u043c. \u041f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u00ab\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u00bb, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0438\u043f <code>TL<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u2014 \u00ab\u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f\u00bb, \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f \u0441 \u043f\u0443\u0441\u0442\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c: <code>TypeList&lt;internal::Void, internal::Void&gt;<\/code>(\u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438 \u043f\u0440\u043e\u0441\u0442\u043e <code>TypeList&lt;&gt;<\/code> \u0438\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u0442\u0438\u043f <code>EmptyTypeList<\/code>) \u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0443\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u2014 \u00ab\u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0438\u043f\u043e\u0432\u00bb. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u0448\u0430 \u00ab\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u00bb \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0438\u043f\u043e\u0432. \u0412 \u043d\u043e\u0432\u043e\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u0438\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0448\u0442\u0443\u043a\u0438, \u043a\u0430\u043a <a href=\"http:\/\/en.cppreference.com\/w\/cpp\/types\/integral_constant\">std::integral_constant<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0436\u0438\u0437\u043d\u044c: \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>struct IsEmpty : std::true_type<\/code>, <code>IsEmpty<\/code> \u0438\u043c\u0435\u0435\u0442 \u0447\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u0430 <code>value<\/code>, \u0440\u044f\u0434 <code>typedef<\/code>-\u043e\u0432 \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 <code>bool<\/code>.<br \/>  \u041a\u0430\u043a \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ?:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;int&gt; TL1; std::cout &lt;&lt; std::boolalpha &lt;&lt; IsEmpty&lt;TL1&gt;::value &lt;&lt; &quot; &quot; &lt;&lt; IsEmpty&lt;EmptyTypeList&gt;() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  \u041f\u0443\u0441\u0442\u043e\u0439 \u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"cpp\">std::is_same&lt;typename TypeList&lt;Args...&gt;::Head, internal::Void&gt;::value && IsEmpty&lt;typename TypeList&lt;Args...&gt;::Tail&gt;::value <\/code><\/pre>\n<p>  \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e \u2014 \u00ab\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0433\u043e\u043b\u043e\u0432\u0430 \u2014 \u044d\u0442\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 <code>void<\/code> \u0418 \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0445\u0432\u043e\u0441\u0442 \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c\u00bb. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e, \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442, \u043f\u043e\u043b\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.<br \/>  \u0414\u0430\u043b\u044c\u0448\u0435:  <\/p>\n<h4>Contains<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Contains<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template&lt;typename T, typename TL&gt; struct Contains :     std::false_type { };  template&lt;typename ...Args&gt; struct Contains&lt;internal::Void, Args...&gt; :     std::false_type { };  template&lt;typename T, typename ...Args&gt; struct Contains&lt;T, TypeList&lt;Args...&gt;&gt; :     std::integral_constant&lt;bool,         std::is_same&lt;typename TypeList&lt;Args...&gt;::Head, T&gt;::value ||         Contains&lt;T, typename TypeList&lt;Args...&gt;::Tail&gt;::value         &gt; { }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <code>Contains<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0435\u0441\u0442\u044c \u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f <code>T<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 <code>TL<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;double, float, float, double, int, char, char, int, char&gt; TL; std::cout &lt;&lt; std::boolalpha &lt;&lt; Contains&lt;char, TL&gt;::value &lt;&lt; &quot; &quot; &lt;&lt; Contains&lt;float, TypeList&lt;double&gt;&gt;() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  \u0421\u043d\u043e\u0432\u0430 \u0436\u0435: \u00ab\u0435\u0441\u043b\u0438 \u0433\u043e\u043b\u043e\u0432\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u044d\u0442\u043e \u043d\u0430\u0448 \u0442\u0438\u043f <code>T<\/code>, \u0442\u043e <code>T<\/code> \u0435\u0441\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043f\u0438\u0441\u043a\u0430, \u0430 \u0438\u043d\u0430\u0447\u0435 \u2014 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 <code>T<\/code> \u0432 \u0445\u0432\u043e\u0441\u0442\u0435 \u0441\u043f\u0438\u0441\u043a\u0430\u00bb.<br \/>  \u0427\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043c\u0435\u0440\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u2014 \u0430 \u0432\u0434\u0440\u0443\u0433 \u043a\u0442\u043e-\u0442\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0448\u0438\u043c \u0442\u0438\u043f\u043e\u043c <code>internal::Void<\/code>?  <\/p>\n<h4>Length<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Length<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template&lt;typename TL&gt; struct Length :     std::integral_constant&lt;unsigned int, 0&gt; { };  template&lt;typename ...Args&gt; struct Length&lt;TypeList&lt;Args...&gt;&gt; :     std::integral_constant&lt;unsigned int,         IsEmpty&lt;TypeList&lt;Args...&gt;&gt;::value             ? 0             : 1 + Length&lt;typename TypeList&lt;Args...&gt;::Tail&gt;::value&gt; { }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442 \u2014 \u0434\u043b\u0438\u043d\u0430 \u043d\u0443\u043b\u0435\u0432\u0430\u044f, \u0430 \u0438\u043d\u0430\u0447\u0435 \u2014 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0438\u0446\u0430(\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u00ab\u0433\u043e\u043b\u043e\u0432\u0430\u00bb(<code>Head<\/code>)) + \u0434\u043b\u0438\u043d\u0430 \u0445\u0432\u043e\u0441\u0442\u0430:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;double, float, float, double, int, char, char, int, char&gt; TL; std::cout &lt;&lt; Length&lt;TL&gt;::value &lt;&lt; &quot; &quot; &lt;&lt; Length&lt;EmptyTypeList&gt;() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  <\/p>\n<h4>TypeAt<\/h4>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt;unsigned int N, typename TL&gt; struct TypeAt {     typedef internal::Void type; }; <\/code><\/pre>\n<p>   \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443, \u043f\u043e\u0447\u0442\u0438, \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u0445\u043e\u0434(\u043c\u0435\u043d\u044f\u0435\u043c \u0442\u0438\u043f <code>N<\/code> \u043d\u0430 <code>int<\/code>):  <\/p>\n<pre><code class=\"cpp\">\/\/template&lt;int N, typename ...Args&gt; \/\/struct TypeAt&lt;N, TypeList&lt;Args...&gt;&gt; \/\/{     \/\/    typedef typename std::conditional&lt;N == 0, \/\/        typename TypeList&lt;Args...&gt;::Head, \/\/        typename TypeAt&lt;N - 1, typename TypeList&lt;Args...&gt;::Tail&gt;::type&gt;::type type; \/\/}; <\/code><\/pre>\n<p>   \u2014 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u043e! \u2014 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0451\u043d\u043d\u044b\u043c, \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441. \u041c\u043e\u0436\u043d\u043e \u0431\u044b \u0431\u044b\u043b\u043e \u0432\u044b\u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f \u0438 \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f <code>N=-1<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0434\u0451\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0451\u043c:  <\/p>\n<pre><code class=\"cpp\">template&lt;typename ...Args&gt; struct TypeAt&lt;0, TypeList&lt;Args...&gt;&gt; {     typedef typename TypeList&lt;Args...&gt;::Head type; };  template&lt;unsigned int N, typename ...Args&gt; struct TypeAt&lt;N, TypeList&lt;Args...&gt;&gt; {     static_assert(N &lt; Length&lt;TypeList&lt;Args...&gt;&gt;::value, &quot;N is too big&quot;);          typedef typename TypeAt&lt;N - 1, typename TypeList&lt;Args...&gt;::Tail&gt;::type type; }; <\/code><\/pre>\n<p>   \u2014 \u0433\u043e\u043b\u043e\u0432\u0430 \u0438\u043c\u0435\u0435\u0442 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441, \u0430 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u2014 \u0431\u0443\u0434\u0435\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0438 \u00ab\u0441\u044a\u0435\u0434\u0430\u0442\u044c\u00bb \u043a\u0443\u0441\u043e\u0447\u0435\u043a \u0445\u0432\u043e\u0441\u0442\u0430(\u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0441\u043b\u0435\u0432\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e), \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043d\u044f\u0442\u044c \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0443\u043b\u0435\u0432\u043e\u0439, \u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0433\u043e\u043b\u043e\u0432\u0430 \u0438 \u0435\u0441\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0442\u0438\u043f! \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;char, short&gt; TL2; static_assert(std::is_same&lt;TypeAt&lt;1, TL2&gt;::type, short&gt;::value, &quot;Something wrong!&quot;); <\/code><\/pre>\n<p>  <\/p>\n<h4>\u0412\u044b\u0432\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">operator&lt;&lt;<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">\/\/ \u041f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a std::ostream& operator&lt;&lt;(std::ostream& ostr, EmptyTypeList) { \tostr &lt;&lt; &quot;{}&quot;; \treturn ostr; }  template&lt;typename TL&gt; void PrintTypeListHelper(TL, std::ostream& ostr) { }  template&lt;typename T&gt; void PrintTypeListHead(T, std::ostream& ostr) { \tostr &lt;&lt; typeid(T).name(); }  template&lt;typename ...Args&gt; void PrintTypeListHead(TypeList&lt;Args...&gt; tl, std::ostream& ostr) { \tostr &lt;&lt; tl; }  template&lt;typename Head, typename ...Args&gt; void PrintTypeListHelper(TypeList&lt;Head, Args...&gt;, std::ostream& ostr) { \tPrintTypeListHead(Head(), ostr); \tif(!IsEmpty&lt;TypeList&lt;Args...&gt;&gt;::value) \t{ \t\tostr &lt;&lt; ' '; \t\tPrintTypeListHelper&lt;Args...&gt;(TypeList&lt;Args...&gt;(), ostr); \t} }  template&lt;typename ...Args&gt; std::ostream& operator&lt;&lt;(std::ostream& ostr, TypeList&lt;Args...&gt; tl) { \tostr &lt;&lt; '{'; \tPrintTypeListHelper(tl, ostr); \tostr &lt;&lt; '}'; \treturn ostr; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u042d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;double, float, float, double, int, char, char, int, char&gt; TL; std::cout &lt;&lt; TL() &lt;&lt; std::endl;  typedef TypeList&lt;TL2, double, TL2&gt; TL10; std::cout &lt;&lt; TL10() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  <code> {double float float double int char char int char} <\/code><br \/>  <code> {{char short} double {char short}} <\/code><\/p>\n<h4>Append \u0438 Add<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Append, Add<\/b><\/p>\n<div class=\"spoiler_text\">\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430, \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439:  <\/p>\n<pre><code class=\"cpp\"> template&lt;typename TOrTL2, typename TL&gt; struct Append { };  template&lt;typename T, typename ...Args&gt; struct Append&lt;T, TypeList&lt;Args...&gt;&gt; {     typedef TypeList&lt;Args..., T&gt; type; };  template&lt;typename ...Args1, typename ...Args2&gt; struct Append&lt;TypeList&lt;Args1...&gt;, TypeList&lt;Args2...&gt;&gt; {     typedef TypeList&lt;Args2..., Args1...&gt; type; };  template&lt;typename T, typename TL&gt; struct Add { };  template&lt;typename T, typename ...Args&gt; struct Add&lt;T, TypeList&lt;Args...&gt;&gt; { \ttypedef TypeList&lt;Args..., T&gt; type; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <code>Append<\/code> \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0442\u0438\u043f\u043e\u0432 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u00ab\u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u00bb \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435. \u0422.\u0435.:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;int&gt; TL1; typedef TypeList&lt;char, short&gt; TL2;  std::cout &lt;&lt; TL1() &lt;&lt; &quot;, &quot; &lt;&lt; TL2() &lt;&lt; std::endl; std::cout &lt;&lt; Add&lt;TL2, TL1&gt;::type() &lt;&lt; &quot;, &quot; &lt;&lt; Append&lt;TL2, TL1&gt;::type() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  <code>{int}, {char short}<\/code><br \/>  <code>{int {char short}}, {int char short}<\/code><br \/>  \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u0438\u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u2014 2, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u2014 3, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u00ab\u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043b\u0441\u044f\u00bb \u043d\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.  <\/p>\n<h4>RemoveAll<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template&lt;typename TOrTL2, typename TL&gt; struct RemoveAll { };  template&lt;typename T, typename ...Args&gt; struct RemoveAll&lt;T, TypeList&lt;Args...&gt;&gt; { private:     typedef typename RemoveAll&lt;T, typename TypeList&lt;Args...&gt;::Tail&gt;::type Removed;     typedef typename TypeList&lt;Args...&gt;::Head Head;      public:     typedef typename std::conditional&lt;         std::is_same&lt;Head, T&gt;::value,         Removed,         typename Append&lt;Removed, TypeList&lt;Head&gt;&gt;::type         &gt;::type type; };  template&lt;typename T, typename Head&gt; struct RemoveAll&lt;T, TypeList&lt;Head&gt;&gt; {     typedef typename std::conditional&lt;         std::is_same&lt;Head, T&gt;::value,         EmptyTypeList,         TypeList&lt;Head&gt;&gt;::type type; };  template&lt;typename T&gt; struct RemoveAll&lt;T, EmptyTypeList&gt; {     typedef EmptyTypeList type; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a:  <\/p>\n<ul>\n<li>\u0421 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043e\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c(\u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u043e\u0432\u0430) \u2014 \u0442\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0435\u0441\u043b\u0438 \u0442\u0438\u043f \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435<\/li>\n<li>\u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u2014 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441 \u0445\u0432\u043e\u0441\u0442\u0430 \u0438 \u0435\u0441\u043b\u0438 \u0442\u0438\u043f \u0433\u043e\u043b\u043e\u0432\u044b \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u0434\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f<\/li>\n<\/ul>\n<p>  \u0412\u0430\u0436\u043d\u043e \u0442\u043e, \u0447\u0442\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0441 \u0445\u0432\u043e\u0441\u0442\u0430 \u043c\u044b \u0441\u0433\u0440\u0443\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432, \u043f\u0440\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>Append<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u00ab\u0440\u0430\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442\u00bb \u043d\u0430\u0437\u0430\u0434 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432.<br \/>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;double, float, float, double, int, char, char, int, char&gt; TL; std::cout &lt;&lt; TL() &lt;&lt; std::endl; std::cout &lt;&lt; RemoveAll&lt;char, TL&gt;::type() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  <code>{double float float double int char char int char}<\/code><br \/>  <code>{double float float double int int}<\/code><\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0432\u0435\u0440\u0441\u0438\u044e <code>RemoveAll<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 \u0432\u0441\u0435 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u043e\u043c. \u041d\u043e! \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">RemoveAll v2<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">\/\/template&lt;typename Head2, typename ...Args1&gt; \/\/struct RemoveAll&lt;TypeList&lt;Head2&gt;, TypeList&lt;Args1...&gt;&gt; \/\/{ \/\/    typedef typename RemoveAll&lt;Head2, TypeList&lt;Args1...&gt;&gt;::type type; \/\/}; \/\/ \/\/template&lt;typename ...Args1&gt; \/\/struct RemoveAll&lt;EmptyTypeList, TypeList&lt;Args1...&gt;&gt; \/\/{ \/\/    typedef TypeList&lt;Args1...&gt; type; \/\/}; \/\/ \/\/template&lt;typename ...Args2, typename ...Args1&gt; \/\/struct RemoveAll&lt;TypeList&lt;Args2...&gt;, TypeList&lt;Args1...&gt;&gt; \/\/{ \/\/private: \/\/    typedef TypeList&lt;Args2...&gt; TL2; \/\/    typedef TypeList&lt;Args1...&gt; TL1; \/\/     \/\/    typedef typename RemoveAll&lt;typename TL2::Tail, TL1&gt;::type Removed; \/\/    typedef typename TL2::Head Head2; \/\/     \/\/public: \/\/    typedef typename std::conditional&lt; \/\/        Contains&lt;Head2, Removed&gt;::value, \/\/        typename RemoveAll&lt;Head2, Removed&gt;::type, \/\/        TL1 \/\/        &gt;::type type;     \/\/}; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;double, float, float, double, int, char, char, int, char&gt; TL; typedef TypeList&lt;char, double&gt; TL2; std::cout &lt;&lt; TL() &lt;&lt; std::endl; std::cout &lt;&lt; RemoveAll&lt;TL2, TL&gt;::type() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  <code>{double float float double int char char int char}<\/code><br \/>  <code>{float float int int}<\/code>  <\/p>\n<h4>RemoveDuplicates<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">RemoveDuplicates<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template&lt;typename TL&gt; struct RemoveDuplicates { };  template&lt;&gt; struct RemoveDuplicates&lt;EmptyTypeList&gt; {     typedef EmptyTypeList type; };  template&lt;typename ...Args&gt; struct RemoveDuplicates&lt;TypeList&lt;Args...&gt;&gt; { private:     typedef TypeList&lt;Args...&gt; TL;     typedef typename RemoveAll&lt;typename TL::Head, typename TL::Tail&gt;::type HeadRemovedFromTail;     typedef typename RemoveDuplicates&lt;HeadRemovedFromTail&gt;::type TailWithoutDuplicates; public:     typedef typename Append&lt;TailWithoutDuplicates, TypeList&lt;typename TL::Head&gt;&gt;::type type; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b:  <\/p>\n<ul>\n<li>\u0421 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c<\/li>\n<li>\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u0430\u043a \u0438 \u0433\u043e\u043b\u043e\u0432\u0430 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430<\/li>\n<li>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0445\u0432\u043e\u0441\u0442\u0430<\/li>\n<li>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u0443 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;double, float, float, double, int, char, char, int, char&gt; TL; std::cout &lt;&lt; TL() &lt;&lt; std::endl; std::cout &lt;&lt; RemoveDuplicates&lt;TL&gt;::type() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  <code>{double float float double int char char int char}<\/code><br \/>  <code>{double float int char}<\/code>  <\/p>\n<h4>Find<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0438\u043f\u0430 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435<\/b><\/p>\n<div class=\"spoiler_text\"><code> struct Constants {     typedef std::integral_constant&lt;unsigned int, UINT_MAX\/*std::numeric_limits&lt;unsigned int&gt;::max()*\/&gt; npos; };  namespace internal { template&lt;typename T, unsigned int IndexFrom, typename TL&gt; struct FindHelper :     std::integral_constant&lt;unsigned int, 0&gt; { };  template&lt;typename T, unsigned int IndexFrom&gt; struct FindHelper&lt;T, IndexFrom, EmptyTypeList&gt; :     std::integral_constant&lt;unsigned int, 0&gt; { };  template&lt;typename T, unsigned int IndexFrom, typename ...Args&gt; struct FindHelper&lt;T, IndexFrom, TypeList&lt;Args...&gt;&gt; :     std::integral_constant&lt;unsigned int,         std::is_same&lt;typename TypeList&lt;Args...&gt;::Head, T&gt;::value         ? IndexFrom         : IndexFrom + 1 + FindHelper&lt;T, IndexFrom, typename TypeList&lt;Args...&gt;::Tail&gt;::value&gt; { }; } \/\/ internal  template&lt;typename T, typename TL&gt; struct Find { };  template&lt;typename T&gt; struct Find&lt;T, EmptyTypeList&gt; :     Constants::npos { };  template&lt;typename ...Args&gt; struct Find&lt;internal::Void, TypeList&lt;Args...&gt;&gt; :     Constants::npos { };  template&lt;typename T, typename ...Args&gt; struct Find&lt;T, TypeList&lt;Args...&gt;&gt; :     std::integral_constant&lt;unsigned int,         Contains&lt;T, TypeList&lt;Args...&gt;&gt;::value         ? internal::FindHelper&lt;T, 0, TypeList&lt;Args...&gt;&gt;::value         : Constants::npos::value&gt; { }; <\/code>  <\/div>\n<\/div>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439:<br \/>   \u2014 <code>Constants<\/code> \u2014 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d(constexp \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u0435\u0439 \u0441\u0442\u0443\u0434\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>UINT_MAX<\/code>)<br \/>   \u2014 <code>internal::FindHelper<\/code> \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u00ab\u0448\u0442\u0443\u043a\u0430\u00bb, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0449\u0435\u0442 \u0442\u0438\u043f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0447\u043d\u043e(!) \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442(\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>IndexFrom<\/code> \u2014 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u0441\u0447\u0451\u0442\u0430, \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430\u044f \u0432\u0435\u0449\u044c:) \u2014 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a)<\/p>\n<p>  \u0421\u043d\u043e\u0432\u0430 \u0436\u0435 \u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u043e\u0433\u043e \u2014 \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0438 \u0442\u0438\u043f \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u2014 \u0442\u043e\u0433\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u2014 \u043d\u0443\u043b\u0435\u0432\u043e\u0439, \u0430 \u0438\u043d\u0430\u0447\u0435 \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u0432\u043f\u0440\u0430\u0432\u043e \u043d\u0430 1\u0446\u0443 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u044f \u0445\u0432\u043e\u0441\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;double, float, float, double, int, char, char, int, char&gt; TL; std::cout &lt;&lt; std::boolalpha &lt;&lt; std::is_same&lt;TypeAt&lt;Find&lt;double, TL&gt;::value, TL&gt;::type, double&gt;() &lt;&lt; std::endl; <\/code><\/pre>\n<h4>Slice<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Slice<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">namespace internal { template&lt;unsigned int IndexBegin, unsigned int IndexEnd, typename TL&gt; struct SliceHelper { };  template&lt;unsigned int IndexBegin, unsigned int IndexEnd&gt; struct SliceHelper&lt;IndexBegin, IndexEnd, EmptyTypeList&gt; {     typedef EmptyTypeList type; };  template&lt;unsigned int IndexBegin, typename ...Args&gt; struct SliceHelper&lt;IndexBegin, IndexBegin, TypeList&lt;Args...&gt;&gt; {     typedef TypeList&lt;typename TypeAt&lt;IndexBegin, TypeList&lt;Args...&gt;&gt;::type&gt; type; };  template&lt;unsigned int IndexBegin, unsigned int IndexEnd, typename ...Args&gt; struct SliceHelper&lt;IndexBegin, IndexEnd, TypeList&lt;Args...&gt;&gt; { private:     static_assert(IndexEnd &gt;= IndexBegin, &quot;Invalid range&quot;);     typedef TypeList&lt;Args...&gt; TL; public:     typedef typename Add&lt;         typename TypeAt&lt;IndexEnd, TL&gt;::type,         typename SliceHelper&lt;IndexBegin, IndexEnd - 1, TL&gt;::type         &gt;::type type; };  } \/\/ internal  template&lt;unsigned int IndexBegin, unsigned int IndexAfterEnd, typename TL&gt; struct Slice { };  template&lt;unsigned int IndexBegin, unsigned int IndexEnd, typename ...Args&gt; struct Slice&lt;IndexBegin, IndexEnd, TypeList&lt;Args...&gt;&gt; {     typedef typename internal::SliceHelper&lt;IndexBegin, IndexEnd, TypeList&lt;Args...&gt;&gt;::type type; };  template&lt;unsigned int Index, typename TL&gt; struct CutTo { };  template&lt;unsigned int Index, typename ...Args&gt; struct CutTo&lt;Index, TypeList&lt;Args...&gt;&gt; {     typedef typename Slice&lt;0, Index, TypeList&lt;Args...&gt;&gt;::type type; };  template&lt;unsigned int Index, typename TL&gt; struct CutFrom { };  template&lt;unsigned int Index, typename ...Args&gt; struct CutFrom&lt;Index, TypeList&lt;Args...&gt;&gt; { private:     typedef TypeList&lt;Args...&gt; TL; public:     typedef typename Slice&lt;Index, Length&lt;TL&gt;::value - 1, TL&gt;::type type; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u00ab\u0412\u044b\u0440\u0435\u0437\u0430\u0435\u0442\u00bb \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430:  <\/p>\n<ul>\n<li>\u0421 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c<\/li>\n<li>\u041a\u043e\u0433\u0434\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0447\u0430\u043b\u043e(<code>IndexBegin<\/code>) \u0438 \u043a\u043e\u043d\u0435\u0446(<code>IndexEnd<\/code>) \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u0442\u043e \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>TypeAt&lt;IndexBegin&gt;<\/code><\/li>\n<li>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u043d\u0446\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0432\u0437\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430(\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043d\u0435\u0446 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\u0446\u0443)<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;double, float, float, double, int, char, char, int, char&gt; TL; std::cout &lt;&lt; TL() &lt;&lt; std::endl; std::cout &lt;&lt; Slice&lt;2, 6, TL&gt;::type() &lt;&lt; std::endl; std::cout &lt;&lt; CutTo&lt;2, TL&gt;::type() &lt;&lt; std::endl; std::cout &lt;&lt; CutFrom&lt;8, TL&gt;::type() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  <code>{double float float double int char char int char}<\/code><br \/>  <code>{float double int char char}<\/code><br \/>  <code>{double float float}<\/code><br \/>  <code>{char}<\/code><\/p>\n<h4>Replace<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Replace<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template&lt;unsigned int Index, typename NewValue, typename TL&gt; struct Replace { };  template&lt;typename NewValue, typename ...Args&gt; struct Replace&lt;0, NewValue, TypeList&lt;Args...&gt;&gt; {     typedef typename Append&lt;typename TypeList&lt;Args...&gt;::Tail, TypeList&lt;NewValue&gt;&gt;::type type; };  template&lt;unsigned int Index, typename NewValue, typename ...Args&gt; struct Replace&lt;Index, NewValue, TypeList&lt;Args...&gt;&gt; { private:     typedef TypeList&lt;Args...&gt; TL;     typedef std::integral_constant&lt;bool, Index == Length&lt;TL&gt;::value - 1&gt; AtEndWorkAround;  public:     typedef typename std::conditional&lt;         AtEndWorkAround::value,         typename internal::ReplaceEnd&lt;NewValue, TL&gt;::type,         typename internal::ReplaceMiddle&lt;AtEndWorkAround::value, Index, NewValue, TL&gt;::type         &gt;::type type; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u0438\u043f \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438(<code>Index<\/code>) \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439(<code>NewValue<\/code>):  <\/p>\n<ul>\n<li>\u0417\u0430\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430:<br \/> \n<ul>\n<li>\u042d\u0442\u043e <code>Head<\/code><\/li>\n<li>C\u043e\u0437\u0434\u0430\u0442\u044c \u0441 <code>NewValue<\/code> \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u00ab\u0445\u0432\u043e\u0441\u0442\u00bb(\u0442.\u0435. \u0432\u0441\u0451 \u043a\u0440\u043e\u043c\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u2014 \u00ab\u0433\u043e\u043b\u043e\u0432\u044b\u00bb)<\/li>\n<\/ul>\n<p>   <\/li>\n<li>\u0417\u0430\u043c\u0435\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430:<br \/> \n<ul>\n<li>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 <code>Index - 1<\/code><\/li>\n<li>\u00ab\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c\u00bb \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0435\u0433\u043e(\u0442.\u0435. \u0434\u043e <code>Index - 2<\/code>)<\/li>\n<li>\u041a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>NewValue<\/code><\/li>\n<\/ul>\n<p>   <\/li>\n<li>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438:<br \/> \n<ul>\n<li>\u0412\u0437\u044f\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442 0 \u0434\u043e <code>Index - 1<\/code> \u2014 <code>Begin<\/code><\/li>\n<li>\u0412\u0437\u044f\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442 <code>Index + 1<\/code> \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u2014 <code>End<\/code><\/li>\n<li>\u041e\u0431\u044a\u0435\u0434\u0435\u043d\u0438\u0442\u044c \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438: <code>Begin<\/code> + <code>NewValue<\/code> + <code>End<\/code><\/li>\n<\/ul>\n<p>   <\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;int, char, float&gt; TLR; std::cout &lt;&lt; TLR() &lt;&lt; std::endl; std::cout &lt;&lt; Replace&lt;0, double, TLR&gt;::type() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  <code>{int char float}<\/code><br \/>  <code>{double char float}<\/code><\/p>\n<h4>ReplaceType<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ReplaceType<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">namespace internal { template&lt;bool NotFoundWorkaround, typename OldValue, typename NewValue, typename TL&gt; struct ReplaceTypeHelper {     typedef EmptyTypeList type; };  template&lt;typename OldValue, typename NewValue, typename ...Args&gt; struct ReplaceTypeHelper&lt;false, OldValue, NewValue, TypeList&lt;Args...&gt;&gt; { private:     typedef TypeList&lt;Args...&gt; TL; public:     typedef typename Replace&lt;Find&lt;OldValue, TL&gt;::value, NewValue, TL&gt;::type type; };  } \/\/ internal  \/\/ Will replace first founded @OldValue template&lt;typename OldValue, typename NewValue, typename TL&gt; struct ReplaceType { };  template&lt;typename OldValue, typename NewValue, typename ...Args&gt; struct ReplaceType&lt;OldValue, NewValue, TypeList&lt;Args...&gt;&gt; { private:     typedef TypeList&lt;Args...&gt; TL;     typedef std::integral_constant&lt;bool,         Find&lt;OldValue, TL&gt;::value == Constants::npos::value         &gt; NotFound; public:     typedef typename std::conditional&lt;         NotFound::value,         TL,         typename internal::ReplaceTypeHelper&lt;             NotFound::value,             OldValue,             NewValue,             TL             &gt;::type         &gt;::type type; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <code>Replace<\/code>, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e(<code>Find<\/code>)<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">typedef TypeList&lt;int, char, float&gt; TLR; std::cout &lt;&lt; TLR() &lt;&lt; std::endl; std::cout &lt;&lt; ReplaceType&lt;char, double, TLR&gt;::type() &lt;&lt; std::endl; <\/code><\/pre>\n<p>  <code>{int char float}<\/code><br \/>  <code>{int double float}<\/code><\/p>\n<h4>\u041a\u0440\u0435\u0441\u0442\u0438\u043a\u0438-\u043d\u043e\u043b\u0438\u043a\u0438<\/h4>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u043e\u043b\u0435, \u043e\u0431\u044b\u0447\u043d\u043e 3\u04453:  <\/p>\n<pre><code class=\"cpp\">\/\/ Empty field struct E { };  struct O { };  struct X { };  enum { ROWS = 3, COLUMNS = 3 };  \/\/ RepeatT \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432, \/\/ \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 N \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 T typedef RepeatT&lt;E, COLUMNS&gt;::type Row; typedef RepeatT&lt;Row, ROWS&gt;::type Field; <\/code><\/pre>\n<p>  \u0422.\u0435. \u043f\u043e\u043b\u0435 \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u044f\u0434\u043a\u043e\u0432(\u0412\u0430\u0436\u043d\u043e <b>*<\/b>), \u0430 \u0440\u044f\u0434\u043e\u043a \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u044f\u0447\u0435\u0435\u043a.<br \/>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0435\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">std::cout &lt;&lt; Field() &lt;&lt; std::endl;  { {struct E struct E struct E} {struct E struct E struct E} {struct E struct E struct E} } <\/code><\/pre>\n<p>  \u0418, \u043a\u043e\u0433\u0434\u0430 <code>COLUMNS = 4<\/code>:<\/p>\n<pre><code class=\"cpp\">{ {struct E struct E struct E struct E} {struct E struct E struct E struct E} {struct E struct E struct E struct E} } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e\u043b\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template&lt;unsigned int R, unsigned int C, typename F&gt; struct FigureAt { private:     typedef typename TypeAt&lt;R, F&gt;::type CurrentRow; public:     typedef typename TypeAt&lt;C, CurrentRow&gt;::type type; };  template&lt;unsigned int R, unsigned int C, typename NewFigure, typename F&gt; struct ReplaceAt { private:     typedef typename TypeAt&lt;R, F&gt;::type OldRow;     typedef typename Replace&lt;C, NewFigure, OldRow&gt;::type NewRow; public:     typedef typename Replace&lt;R, NewRow, F&gt;::type type; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">typedef ReplaceAt&lt;1, 1, X, Field&gt;::type Field2; typedef ReplaceAt&lt;2, 1, X, Field2&gt;::type Field3;  { {struct E struct E struct E struct E} {struct E struct X struct E struct E} {struct E struct X struct E struct E} }  <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u043b\u0435 \u0435\u0441\u0442\u044c, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u044b \u0443\u043c\u0435\u0435\u043c \u2014 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0435\u0441\u0442\u044c \u043b\u0438 \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c?<br \/>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: \u043f\u043e\u0431\u0435\u0434\u0438\u043b \u0442\u043e\u0442, \u043a\u0442\u043e \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u043b \u0438\u043b\u0438 \u0440\u044f\u0434, \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0438\u043a(\u043f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441). \u0422.\u0435. \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0443 \u043d\u0430\u0441\u0442\u044c \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0438\u0432 \u0440\u044f\u0434\u043e\u0447\u043a\u043e\u0432(\u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u0432) \u0438 \u0435\u0441\u043b\u0438 \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043e\u0434\u043d\u0438\u043c \u0437\u043d\u0430\u043a\u043e\u043c(\u043a\u0440\u0435\u0441\u0442\u0438\u043a\u043e\u043c, \u043d\u043e\u043b\u0438\u043a\u043e\u043c) \u0440\u044f\u0434\u043e\u0447\u0435\u043a(\u0441\u0442\u043e\u043b\u0431\u0438\u043a), \u0442\u043e \u044d\u0442\u043e\u0442 \u0437\u043d\u0430\u043a \u043f\u043e\u0431\u0435\u0434\u0438\u043b!<br \/>  \u0418\u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">template&lt;typename Figure, typename Field&gt; struct IsWin {     \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0440\u044f\u0434\u043e\u043a \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0438\u043a \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044f     typedef typename RepeatT&lt;Figure, COLUMNS&gt;::type WinRow;     typedef typename RepeatT&lt;Figure, ROWS&gt;::type WinColumn;      \/\/ \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0440\u044f\u0434\u043e\u043a \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0438\u043a \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044f     static const bool value = Contains&lt;WinRow, Field&gt;::value ||     \/\/ Field - \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u044f\u0434\u043a\u043e\u0432, ReconfigureField -     \/\/ \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u044f\u0434\u043a\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u0432         Contains&lt;WinColumn, typename ReconfigureField&lt;Field&gt;::type&gt;::value; }; <\/code><\/pre>\n<p>  \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 <code>ReconfigureField<\/code>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ReconfigureField<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">namespace internal { template&lt;unsigned int C, unsigned int R, typename CurrentColumnType, typename F&gt; struct ColumnTypeHelper {     typedef typename Add&lt;         typename FigureAt&lt;R, C, F&gt;::type,         typename ColumnTypeHelper&lt;C, R - 1, CurrentColumnType, F&gt;::type         &gt;::type type; };  template&lt;unsigned int C, typename CurrentColumnType, typename F&gt; struct ColumnTypeHelper&lt;C, 0, CurrentColumnType, F&gt; {     typedef typename Add&lt;typename FigureAt&lt;0, C, F&gt;::type, CurrentColumnType&gt;::type type; };  } \/\/ internal  template&lt;unsigned int C, typename F&gt; struct ColumnType {     typedef typename internal::ColumnTypeHelper&lt;C, ROWS - 1, EmptyTypeList, F&gt;::type type; };  namespace internal { template&lt;unsigned int C, typename NewF, typename F&gt; struct ReconfigureFieldHelper {     typedef typename Add&lt;         typename ColumnType&lt;C, F&gt;::type,         typename ReconfigureFieldHelper&lt;C - 1, NewF, F&gt;::type         &gt;::type type; };  template&lt;typename NewF, typename F&gt; struct ReconfigureFieldHelper&lt;0, NewF, F&gt; {     typedef typename Add&lt;         typename ColumnType&lt;0, F&gt;::type,         NewF         &gt;::type type; }; } \/\/ internal  template&lt;typename F&gt; struct ReconfigureField {     typedef typename internal::ReconfigureFieldHelper&lt;         COLUMNS - 1, EmptyTypeList, F&gt;::type type; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0427\u0442\u043e <code>ReconfigureField<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435(\u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0438\u0434\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u0432 \u0438 \u0440\u044f\u0434\u043e\u0447\u043a\u043e\u0432 \u043d\u0435\u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e):<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ReconfigureField: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">typedef ReplaceAt&lt;1, 1, X, Field&gt;::type Field2; typedef ReplaceAt&lt;2, 1, X, Field2&gt;::type Field3;  std::cout &lt;&lt; Field3() &lt;&lt; std::endl; std::cout &lt;&lt; ReconfigureField&lt;Field3&gt;::type() &lt;&lt; std::endl;  { {struct E struct E struct E struct E} {struct E struct X struct E struct E} {struct E struct X struct E struct E} }  { {struct E struct E struct E} {struct E struct X struct X} {struct E struct E struct E} {struct E struct E struct E} }  <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422.\u0435. 1 \u0441\u0442\u043e\u043b\u0431\u0438\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 1 \u0440\u044f\u0434\u043a\u043e\u043c, 2\u0439 \u0441\u0442\u043e\u043b\u0431\u0438\u043a \u2014 2\u043c \u0438 \u0442.\u0434. \u2014 \u044d\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0441\u0442\u043e\u043b\u0431\u0438\u043a \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044f \u043d\u0430 \u043f\u043e\u043b\u0435, \u0447\u0442\u043e \u043c\u044b \u0438 \u0434\u0435\u043b\u0430\u0435\u043c:  <\/p>\n<pre><code class=\"cpp\">Contains&lt;WinColumn, typename ReconfigureField&lt;Field&gt;::type&gt;::value <\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0435\u0449\u0451 \u043f\u043e\u0438\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u044f \u0443\u0441\u0442\u0430\u043b. \u0412 \u043a\u043e\u043d\u0446\u0435-\u043a\u043e\u043d\u0446\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">typedef ReplaceAt&lt;1, 1, X, Field&gt;::type Field2; typedef ReplaceAt&lt;2, 1, X, Field2&gt;::type Field3; typedef ReplaceAt&lt;0, 1, X, Field3&gt;::type Field4;  std::cout &lt;&lt; std::boolalpha &lt;&lt; IsWin&lt;X, Field2&gt;::value &lt;&lt; std::endl; std::cout &lt;&lt; std::boolalpha &lt;&lt; IsWin&lt;X, Field3&gt;::value &lt;&lt; std::endl; std::cout &lt;&lt; std::boolalpha &lt;&lt; IsWin&lt;X, Field4&gt;::value &lt;&lt; std::endl;  \/\/ \u0412\u044b\u0432\u043e\u0434 false false true <\/code><\/pre>\n<p>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/220217\/\"> http:\/\/habrahabr.ru\/post\/220217\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u0417\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e(!), \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c <code>variadic templates<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a 10\u0439 \u0441\u0442\u0443\u0434\u0438\u0438, \u0433\u0434\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442\u0443. \u0410 \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u043b\u0433\u043e \u043d\u0435 \u0434\u0443\u043c\u0430\u0442\u044c, \u0433\u0434\u0435 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c variadic templates, \u043f\u0440\u0438\u0448\u043b\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c <a href=\"http:\/\/erdani.com\/\">Typelist<\/a>. \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435, \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430, \u0430 \u0442\u0435\u043c, \u043a\u043e\u043c\u0443 \u044d\u0442\u043e \u0441\u043a\u0443\u0447\u043d\u043e \u2014 \u043c\u043e\u0436\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043b\u0438\u0441\u0442\u0430\u0442\u044c \u0432\u043d\u0438\u0437 \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u043a\u0440\u0435\u0441\u0442\u0438\u043a\u043e\u0432-\u043d\u043e\u043b\u0438\u043a\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>Typelist<\/code>.<br \/>  \u0418\u0442\u0430\u043a, <code>TypeList<\/code>:  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-220217","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/220217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=220217"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/220217\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=220217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=220217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=220217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}