{"id":287994,"date":"2018-08-16T14:20:44","date_gmt":"2018-08-16T10:20:44","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=287994"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=287994","title":{"rendered":"\u041a\u0430\u043a \u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 C++11 \u043f\u0438\u0441\u0430\u043b \u0438\u043b\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 boost \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0439. \u0413\u043b\u0430\u0432\u0430 4.3"},"content":{"rendered":"\n<div data-io-article-url=\"https:\/\/habr.com\/post\/418347\/\" class=\"post__text post__text-html js-mediator-article\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/lr\/zq\/if\/lrzqifvfeajppx2fdvqbxnwf4ce.png\" alt=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.\" width=\"300\" height=\"350\" align=\"left\"> <\/p>\n<h3>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439<\/h3>\n<p>   \u0418\u0437-\u0437\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b C++ 11 \u0438 \u043e\u0442 \u0431\u0435\u0437\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 boost&#8217;\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 C++ 11 \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0439 \u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 C++ 98 \/ C++ 03.<\/p>\n<p>  \u0411\u044b\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b <b>static_assert<\/b>, <b>noexcept<\/b>, <b>countof<\/b>, \u0430 \u0442\u0430\u043a \u0436\u0435, \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0435\u0444\u0430\u0439\u043d\u043e\u0432 \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c. \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0441\u0432\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <b>nullptr<\/b>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>   \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f <b>type_traits<\/b> \u0438 \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u00ab\u043e\u0441\u043e\u0431\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u043c\u0430\u0433\u0438\u0438\u00bb. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u044b \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043c\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043f\u0440\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \u0442\u0435\u0445\u043d\u0438\u043a\u0438 SFINAE \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>   \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 GitHub \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043b\u044f \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0445 \u0438 \u043d\u0435\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439:  <\/p>\n<blockquote><p><b><a href=\"https:\/\/github.com\/oktonion\/stdex\">\u041a\u043e\u043c\u043c\u0438\u0442\u044b \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u0440\u0438\u0442\u0438\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f<\/a><\/b><\/p><\/blockquote>\n<p> \u0411\u043e\u043b\u044c\u0448\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 C++ \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c.<br \/>  <a name=\"habracut\"><\/a>   <\/p>\n<h4>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h4>\n<p>   <a href=\"https:\/\/habr.com\/post\/417027\/\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><br \/>   <a href=\"https:\/\/habr.com\/post\/417027\/\">\u0413\u043b\u0430\u0432\u0430 1. Viam supervadet vadens<\/a><br \/>   <a href=\"https:\/\/habr.com\/post\/417099\/\">\u0413\u043b\u0430\u0432\u0430 2. #ifndef __CPP11_SUPPORT__ #define __COMPILER_SPECIFIC_BUILT_IN_AND_MACRO_HELL__ #endif<\/a><br \/>   <a href=\"https:\/\/habr.com\/post\/417295\/\">\u0413\u043b\u0430\u0432\u0430 3. \u041f\u043e\u0438\u0441\u043a \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 nullptr<\/a><br \/>   <a href=\"https:\/\/habr.com\/post\/417547\/\">\u0413\u043b\u0430\u0432\u0430 4. \u0428\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f \u00ab\u043c\u0430\u0433\u0438\u044f\u00bb C++<\/a><br \/>   &#8230;.<a href=\"https:\/\/habr.com\/post\/417547\/\">4.1 \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u043c\u0430\u043b\u043e\u0433\u043e<\/a><br \/>   &#8230;.<a href=\"https:\/\/habr.com\/post\/417949\/\">4.2 \u041e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043c \u043e\u0448\u0438\u0431\u043e\u043a \u0447\u0443\u0434\u043d\u044b\u0445 \u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0439 \u043b\u043e\u0433<\/a><br \/>   &#8230;.<b>4.3 \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0438 \u0432\u0441\u0435-\u0432\u0441\u0435-\u0432\u0441\u0435<\/b><br \/>   &#8230;.<a href=\"https:\/\/habr.com\/post\/420365\/\">4.4 \u0427\u0442\u043e \u0436\u0435 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/a><br \/>   \u0413\u043b\u0430\u0432\u0430 5.<br \/>  \u2026<\/p>\n<h3>\u0413\u043b\u0430\u0432\u0430 4. \u0428\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f \u00ab\u043c\u0430\u0433\u0438\u044f\u00bb C++. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435<\/h3>\n<p>   <\/p>\n<h4>4.3 \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0438 \u0432\u0441\u0435-\u0432\u0441\u0435-\u0432\u0441\u0435<\/h4>\n<p>   \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0438\u043f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0434\u043b\u044f <i>std::is_array<\/i> \u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a \u0436\u0435 \u0431\u044b\u043b\u0430 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0435 \u0431\u0435\u0437 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u0439.<\/p>\n<pre><code class=\"cpp\">\/\/ is_array template&lt;class&gt; struct is_array :     public false_type { };  template&lt;class _Tp, std::size_t _Size&gt; struct is_array&lt;_Tp[_Size]&gt; :     public true_type { };  \/*template&lt;class _Tp&gt; struct is_array&lt;_Tp[]&gt;:     public true_type { }; *\/ <\/code><\/pre>\n<p>   \u041f\u0440\u043e\u0441\u0442\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 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u00ab\u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u00bb \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0441 \u043d\u0435\u043f\u043e\u043b\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c <i>T[]<\/i> (\u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u044b). \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438 (C++ Builder) \u043f\u0440\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0434\u0435\u0441\u044c \u044f \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435 \u043d\u0430\u0448\u0435\u043b.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0431\u044b\u043b\u0430 \u00ab\u043d\u0430\u0443\u0447\u0435\u043d\u0430\u00bb \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u0438\u043f\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0432\u0435\u0449\u0430\u043c \u0447\u0435\u0440\u0435\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0441\u0441\u044b\u043b\u043e\u043a.<\/p>\n<p>  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ti\/rp\/mi\/tirpmiwggsavcvlxyjbo8dlv5ee.png\" alt=\"image\" width=\"300\" height=\"280\" align=\"left\"> \u0412 \u044f\u0437\u044b\u043a\u0435 C++ \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0432\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0447\u043b\u0435\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0447\u043b\u0435\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043c\u0435\u044e\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430\u043b\u0438\u0447\u0438\u0435\u043c <b>this<\/b>, \u0442.\u0435. \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0418 \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0447\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0447\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 <i> == <\/i><b>sizeof(void*)<\/b>), \u0442.\u043a. \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439-\u0447\u043b\u0435\u043d\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f <b>this<\/b> \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0447\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 (\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/stackoverflow.com\/questions\/99297\/how-are-virtual-functions-and-vtable-implemented\">\u043f\u0440\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0444-\u0438\u0438<\/a> \u0438 <a href=\"http:\/\/lazarenko.me\/wide-pointers\/\">\u043f\u0440\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443<\/a>). \u0422\u043e \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0447\u043b\u0435\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043c, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443, \u043d\u0430 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0438 \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0439 \u043a\u043e\u0434.<\/p>\n<p>  \u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d <i>is_pointer<\/i>, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0448\u0430\u0431\u043b\u043e\u043d <i>is_lvalue_reference<\/i> \u0434\u043b\u044f \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 (<i>is_rvalue_reference<\/i> \u043e\u0442\u0441\u0442\u0430\u0432\u0438\u043c, \u0442.\u043a. \u0434\u043e 11 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <i>&amp;&amp;<\/i>, \u0442\u0430\u043a \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c move-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e):<\/p>\n<pre><code class=\"cpp\">namespace detail {     template&lt;class&gt;     struct _is_pointer_helper :         public false_type { };      template&lt;class _Tp&gt;     struct _is_pointer_helper&lt;_Tp*&gt; :         public true_type { }; }  \/\/ is_pointer template&lt;class _Tp&gt; struct is_pointer :     public detail::_is_pointer_helper&lt;typename remove_cv&lt;_Tp&gt;::type&gt;::type { };  \/\/ is_lvalue_reference template&lt;class&gt; struct is_lvalue_reference :     public false_type { };  template&lt;class _Tp&gt; struct is_lvalue_reference&lt;_Tp&amp;&gt; :     public true_type { }; <\/code><\/pre>\n<p>   \u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u043d\u0435\u0442 \u0447\u0435\u0433\u043e-\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u043e\u0433\u043e, \u0432\u0441\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u044b. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.   <\/p>\n<blockquote><p>\u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f-\u0447\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u0430 \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443: <\/p>\n<ul>\n<li> \u041d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442), \u043d\u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0447\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"cpp\">void (*func_ptr)(int); \/\/ \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c 'func_ptr' \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0438\u0434\u0430 'void func(int){}' void (ClassType::*mem_func_ptr)(int); \/\/ \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c 'mem_func_ptr' \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0447\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u0430 'ClassType' \u0432\u0438\u0434\u0430 'void ClassType::func(int){}' <\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li> \u041d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442), \u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"cpp\">void (&amp;func_ref)(int); \/\/ \u0441\u0441\u044b\u043b\u043a\u0430 'func_ref' \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0438\u0434\u0430 'void func(int){}' \/\/-------------------- \/\/ \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0447\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c <\/code><\/pre>\n<\/blockquote>\n<p> \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a \u0440\u0430\u0437 \u0443\u043f\u043e\u043c\u044f\u043d\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u043e C++ 11 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0432\u0441\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0433\u0434\u0435 \u043c\u043e\u0433\u043b\u043e \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 <a href=\"https:\/\/github.com\/oktonion\/Cpp-fast-delegates\/blob\/master\/delegates\/delegate.h\">\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043b\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0441 \u043a\u0430\u043a\u0438\u043c \u043d\u0438 \u0431\u0443\u0434\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/a> \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0438 \u0438\u0445 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438-\u043f\u0443\u0441\u0442\u044b\u0448\u043a\u0430\u043c\u0438 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0438 \u043a \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442.\u043a. \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u043e 60-70 \u0441\u0442\u0440\u043e\u043a \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043e\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u043d\u044b\u043b\u044b\u043c \u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0437\u0430\u043d\u044f\u0442\u0438\u0435\u043c, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0447\u0440\u0435\u0432\u0430\u0442\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043e\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439. \u042f \u0440\u0435\u0448\u0438\u043b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043e 24 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0432 \u043a\u043e\u0434\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e, \u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">namespace detail {     template &lt;class R&gt;     struct _is_function_ptr_helper : false_type {};     template &lt;class R &gt;     struct _is_function_ptr_helper&lt;R(*)()&gt; : true_type {};     template &lt;class R &gt;     struct _is_function_ptr_helper&lt;R(*)(...)&gt; : true_type {};     template &lt;class R, class T0&gt;     struct _is_function_ptr_helper&lt;R(*)(T0)&gt; : true_type {};     template &lt;class R, class T0&gt;     struct _is_function_ptr_helper&lt;R(*)(T0 ...)&gt; : true_type {}; <\/code><\/pre>\n<p>  <b>&#8230;<\/b>  <\/p>\n<pre><code class=\"cpp\">    template &lt;class R, class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15, class T16, class T17, class T18, class T19, class T20, class T21, class T22, class T23, class T24&gt;     struct _is_function_ptr_helper&lt;R(*)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24)&gt; : true_type {};     template &lt;class R, class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15, class T16, class T17, class T18, class T19, class T20, class T21, class T22, class T23, class T24&gt;     struct _is_function_ptr_helper&lt;R(*)(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24 ...)&gt; : true_type {}; } <\/code><\/pre>\n<p>   \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u044b \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0438 SFINAE:<\/p>\n<pre><code class=\"cpp\">namespace detail {     \/\/ SFINAE magic      typedef char _yes_type;     struct _no_type     {         char padding[8];     }; } <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0415\u0449\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">namespace detail {     #define _IS_MEM_FUN_PTR_CLR \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS)); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS...)); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS) const); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS) volatile); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS) const volatile); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS...) const); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS...) volatile); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(T::*const volatile*)(ARGS...) const volatile);  #ifdef _STDEX_CDECL \t\t_no_type _STDEX_CDECL _is_mem_function_ptr(...);  #define _IS_MEM_FUN_CDECL_PTR \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__cdecl T::*const volatile*)(ARGS)); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__cdecl T::*const volatile*)(ARGS) const); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__cdecl T::*const volatile*)(ARGS) volatile); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__cdecl T::*const volatile*)(ARGS) const volatile);  #define _IS_MEM_FUN_STDCALL_PTR \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__stdcall T::*const volatile*)(ARGS)); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__stdcall T::*const volatile*)(ARGS) const); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__stdcall T::*const volatile*)(ARGS) volatile); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__stdcall T::*const volatile*)(ARGS) const volatile);  #define _IS_MEM_FUN_FASTCALL_PTR \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__fastcall T::*const volatile*)(ARGS)); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__fastcall T::*const volatile*)(ARGS) const); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__fastcall T::*const volatile*)(ARGS) volatile); \\ \t\ttemplate &lt;class R, class T TYPES &gt; \\ \t\t_yes_type _is_mem_function_ptr(R(__fastcall T::*const volatile*)(ARGS) const volatile); #else \t\t_no_type _is_mem_function_ptr(...); #define _IS_MEM_FUN_CDECL_PTR #define _IS_MEM_FUN_STDCALL_PTR #define _IS_MEM_FUN_FASTCALL_PTR #endif  #define _IS_MEM_FUN_PTR \\ \t\t_IS_MEM_FUN_PTR_CLR \\ \t\t_IS_MEM_FUN_CDECL_PTR \\ \t\t_IS_MEM_FUN_STDCALL_PTR \\ \t\t_IS_MEM_FUN_FASTCALL_PTR } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>   \u041c\u0430\u043a\u0440\u043e\u0441\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c <b>TYPES<\/b> \u0438 <b>ARGS<\/b> \u0434\u0435\u0444\u0430\u0439\u043d\u044b \u043a\u0430\u043a \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043c\u0430\u043a\u0440\u043e\u0441 <b>_IS_MEM_FUN_PTR<\/b> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0422\u0430\u043a \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Microsoft \u0432\u0430\u0436\u043d\u044b \u0435\u0449\u0435 <a href=\"https:\/\/msdn.microsoft.com\/ru-ru\/library\/984x0h58.aspx\">\u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u043e \u0432\u044b\u0437\u043e\u0432\u0430\u0445<\/a> (<b>__fastcall<\/b>, <b>__stdcall<\/b> \u0438 <b>__cdecl<\/b>), \u0442.\u043a. \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043d\u044b\u043c\u0438, \u0445\u043e\u0442\u044f \u043d\u0430\u0431\u043e\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443 \u043d\u0438\u0445 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u0441\u044f \u044d\u0442\u0430 \u0433\u0440\u0430\u043d\u0434\u0438\u043e\u0437\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">namespace detail {     #define TYPES     #define ARGS     _IS_MEM_FUN_PTR #undef TYPES #undef ARGS      #define TYPES , class T0     #define ARGS T0     _IS_MEM_FUN_PTR #undef TYPES #undef ARGS          #define TYPES , class T0, class T1     #define ARGS T0, T1     _IS_MEM_FUN_PTR #undef TYPES #undef ARGS <\/code><\/pre>\n<p>  <b>&#8230;<\/b>  <\/p>\n<pre><code class=\"cpp\">    #define TYPES , class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class T11, class T12, class T13, class T14, class T15, class T16, class T17, class T18, class T19, class T20, class T21, class T22, class T23, class T24     #define ARGS T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24     _IS_MEM_FUN_PTR #undef TYPES #undef ARGS  \/\/ \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043b\u0438\u0448\u043d\u0438\u0435 define \u0437\u0430 \u0441\u043e\u0431\u043e\u0439: #undef _IS_MEM_FUN_PTR #undef _IS_MEM_FUN_PTR_CLR \t\t #undef _IS_MEM_FUN_CDECL_PTR #undef _IS_MEM_FUN_STDCALL_PTR #undef _IS_MEM_FUN_FASTCALL_PTR } <\/code><\/pre>\n<p>   \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u043e, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u0432\u0441\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">namespace detail {     template &lt;class _Tp, bool _IsRef&gt;     struct _is_mem_function_ptr_impl     {         static _Tp *p;         static const bool value = (sizeof(_is_mem_function_ptr(_is_mem_function_ptr_impl::p)) == sizeof(_yes_type));          typedef typename integral_constant&lt;bool, _is_mem_function_ptr_impl::value == bool(true)&gt;::type type;     };      template &lt;class _Tp&gt;     struct _is_mem_function_ptr_impl&lt;_Tp, true&gt;:         public false_type     {};      template &lt;class _Tp&gt;     struct _is_mem_function_ptr_helper:         public _is_mem_function_ptr_impl&lt;_Tp, is_reference&lt;_Tp&gt;::value&gt;::type     {};      template &lt;class _Tp, bool _IsMemberFunctionPtr&gt;     struct _is_function_chooser_impl :         public false_type     { };      template &lt;class _Tp&gt;     struct _is_function_chooser_impl&lt;_Tp, false&gt; :         public _is_function_ptr_helper&lt;_Tp*&gt;     { };      template&lt;class _Tp, bool _IsRef = true&gt;     struct _is_function_chooser :         public false_type     { };      template &lt;class _Tp&gt;     struct _is_function_chooser&lt;_Tp, false&gt;     {          static const bool value = _is_function_chooser_impl&lt;_Tp, _is_mem_function_ptr_helper&lt;_Tp&gt;::value&gt;::value;     }; } <\/code><\/pre>\n<p>   \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439-\u0447\u043b\u0435\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0438\u043f \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u043c. \u0417\u0430\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u043f\u0440\u043e\u0431\u043d\u0438\u043a. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0443 SFINAE \u0441\u0438\u043b\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0438\u0437 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043e\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439-\u043f\u0440\u043e\u0431\u043d\u0438\u043a\u043e\u0432 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441 <i>_yes_type<\/i> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>  \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0447\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0438\u043f\u0430 \u043d\u0430 \u0435\u0433\u043e \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0438\u043f \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u043c, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0438\u0449\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440-\u043f\u0440\u043e\u0431\u043d\u0438\u043a\u043e\u0432 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 <i>true_type<\/i> \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e 24 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>  \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <i>is_function<\/i>. \u0417\u0434\u0435\u0441\u044c, \u043f\u043e \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0447\u0442\u043e \u0438 \u0432 <a href=\"https:\/\/habr.com\/post\/417949\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438<\/a>, \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043e\u0442\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043e\u0442 <i>integral_constant<\/i>, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <i>integral_constant<\/i> \u00ab\u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f\u00bb.<\/p>\n<pre><code class=\"cpp\">\/\/ is_function template&lt;class _Tp&gt; struct is_function {     static const bool value = detail::_is_function_chooser&lt;_Tp, is_reference&lt;_Tp&gt;::value&gt;::value;      typedef const bool value_type;     typedef integral_constant&lt;bool, is_function::value == bool(true)&gt; type;      operator value_type() const     {\t\/\/ return stored value         return (value);     }      value_type operator()() const     {\t\/\/ return stored value         return (value);     } }; <\/code><\/pre>\n<p>   \u0410 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <i>is_member_function_pointer<\/i> \u0432\u0441\u0435 \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435:<\/p>\n<pre><code class=\"cpp\">\/\/ is_member_function_pointer template&lt;class _Tp&gt; struct is_member_function_pointer :     public detail::_is_mem_function_ptr_helper&lt;typename remove_cv&lt;_Tp&gt;::type&gt;::type { }; <\/code><\/pre>\n<p>   \u0414\u0430\u043b\u0435\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u0438\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0438\u043f \u0432\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0447\u043b\u0435\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"cpp\">namespace detail {     template&lt;class _Tp&gt;     struct _is_member_object_pointer_impl1 :         public _not_&lt; _or_&lt;_is_function_ptr_helper&lt;_Tp&gt;, _is_mem_function_ptr_helper&lt;_Tp&gt; &gt; &gt;::type     { };      template&lt;class _Tp&gt;     struct _is_member_object_pointer_impl2 :         public false_type { };      template&lt;class _Tp, class _Cp&gt;     struct _is_member_object_pointer_impl2&lt;_Tp _Cp::*&gt; :         public true_type { };      template&lt;class _Tp&gt;     struct _is_member_object_pointer_helper:         public _and_&lt;_is_member_object_pointer_impl1&lt;_Tp&gt;, _is_member_object_pointer_impl2&lt;_Tp&gt; &gt;::type     {};  } \/\/ is_member_object_pointer template&lt;class _Tp&gt; struct is_member_object_pointer :     public detail::_is_member_object_pointer_helper&lt;typename remove_cv&lt;_Tp&gt;::type&gt;::type { }; <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 &#8216;\u0438&#8217;, &#8216;\u0438\u043b\u0438&#8217;, &#8216;\u043d\u0435&#8217; \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">namespace detail {     struct void_type {};      \/\/typedef void void_type;      template&lt;class _B1 = void_type, class _B2 = void_type, class _B3 = void_type, class _B4 = void_type&gt;     struct _or_ :         public conditional&lt;_B1::value, _B1, _or_&lt;_B2, _or_&lt;_B3, _B4&gt; &gt; &gt;::type     { };       template&lt;&gt;     struct _or_&lt;void_type, void_type, void_type, void_type&gt;;      template&lt;class _B1&gt;     struct _or_&lt;_B1, void_type, void_type, void_type&gt; :         public _B1     { };      template&lt;class _B1, class _B2&gt;     struct _or_&lt;_B1, _B2, void_type, void_type&gt; :         public conditional&lt;_B1::value, _B1, _B2&gt;::type     { };      template&lt;class _B1, class _B2, class _B3&gt;     struct _or_&lt;_B1, _B2, _B3, void_type&gt; :         public conditional&lt;_B1::value, _B1, _or_&lt;_B2, _B3&gt; &gt;::type     { };      template&lt;class _B1 = void_type, class _B2 = void_type, class _B3 = void_type, class _B4 = void_type&gt;     struct _and_;       template&lt;&gt;     struct _and_&lt;void_type, void_type, void_type, void_type&gt;;      template&lt;class _B1&gt;     struct _and_&lt;_B1, void_type, void_type, void_type&gt; :         public _B1     { };      template&lt;class _B1, class _B2&gt;     struct _and_&lt;_B1, _B2, void_type, void_type&gt; :         public conditional&lt;_B1::value, _B2, _B1&gt;::type     { };      template&lt;class _B1, class _B2, class _B3&gt;     struct _and_&lt;_B1, _B2, _B3, void_type&gt; :         public conditional&lt;_B1::value, _and_&lt;_B2, _B3&gt;, _B1&gt;::type     { };      template&lt;class _Pp&gt;     struct _not_     {         static const bool value = !bool(_Pp::value);          typedef const bool value_type;         typedef integral_constant&lt;bool, _not_::value == bool(true)&gt; type;          operator value_type() const         {\t\/\/ return stored value             return (value);         }          value_type operator()() const         {\t\/\/ return stored value             return (value);         }     }; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>   \u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0442\u0438\u043f\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 <i>conditional<\/i> \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u0442\u0438\u043f. \u0428\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e \u0432\u0441\u0435\u0439 \u0435\u0433\u043e \u043a\u0440\u0430\u0441\u0435, \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0443\u0436\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0438\u043f \u0447\u043b\u0435\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u00ab\u0437\u0443\u0431\u043e\u0434\u0440\u043e\u0431\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u00bb, \u043d\u043e \u0437\u0430\u0442\u043e \u043a\u0430\u043a \u044d\u0444\u0444\u0435\u043a\u0442\u043d\u043e \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e!<\/p>\n<p>  \u0415\u0449\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u044d\u0442\u0438\u0445 \u0436\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <i>is_fundamental<\/i>, <i>is_compound<\/i> \u0438 \u0442.\u043f. \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 (\u043c\u0435\u043d\u044f \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0432 \u0432\u043e\u0441\u0442\u043e\u0440\u0433, \u0430 \u0432\u0430\u0441?):<\/p>\n<pre><code class=\"cpp\">\/\/ is_arithmetic template&lt;class _Tp&gt; struct is_arithmetic :     public detail::_or_&lt;is_integral&lt;_Tp&gt;, is_floating_point&lt;_Tp&gt; &gt;::type { };  \/\/ is_fundamental template&lt;class _Tp&gt; struct is_fundamental :     public detail::_or_&lt;is_arithmetic&lt;_Tp&gt;, is_void&lt;_Tp&gt;, is_null_pointer&lt;_Tp&gt; &gt;::type {};  \/\/ is_object template&lt;class _Tp&gt; struct is_object :     public detail::_not_&lt; detail::_or_&lt; is_function&lt;_Tp&gt;, is_reference&lt;_Tp&gt;, is_void&lt;_Tp&gt; &gt; &gt;::type {};  \/\/ is_scalar template&lt;class _Tp&gt; struct is_scalar :     public detail::_or_&lt;is_arithmetic&lt;_Tp&gt;, is_pointer&lt;_Tp&gt;, is_member_pointer&lt;_Tp&gt;, is_null_pointer&lt;_Tp&gt;\/*, is_enum&lt;_Tp&gt;*\/ &gt;::type {};  \/\/ is_compound template&lt;class _Tp&gt; struct is_compound:     public detail::_not_&lt;is_fundamental&lt;_Tp&gt; &gt;::type { }; <\/code><\/pre>\n<blockquote><p>\u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u0438\u0442 \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <i>is_enum<\/i> \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c <b>enum<\/b> \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b, \u043d\u043e \u0441\u0447\u0438\u0442\u0430\u044e \u0447\u0442\u043e \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u043e \u0431\u0435\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u0441\u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u043b\u0438 \u0445\u043e\u0434 \u043c\u044b\u0441\u043b\u0435\u0439 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0435\u0442.<\/p><\/blockquote>\n<p> \u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430 \u0447\u0442\u043e \u0442\u0438\u043f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e:<\/p>\n<pre><code class=\"cpp\">namespace detail {     template &lt;class _Tp, bool _IsReference&gt;     struct _is_class_helper     {         typedef integral_constant&lt;bool, false&gt; type;     };      template &lt;class _Tp&gt;     struct _is_class_helper&lt;_Tp, false&gt;     {         typedef integral_constant&lt;bool,             (is_scalar&lt;_Tp&gt;::value == bool(false))             \/\/&amp;&amp; !is_union&lt;_Tp&gt;::value &gt;::value             &amp;&amp; (is_array&lt;_Tp&gt;::value == bool(false))             &amp;&amp; (is_void&lt;_Tp&gt;::value == bool(false))             &amp;&amp; (is_function&lt;_Tp&gt;::value == bool(false))&gt; type;     }; }  \/\/ is_class template&lt;class _Tp&gt; struct is_class :     public detail::_is_class_helper&lt;typename remove_cv&lt;_Tp&gt;::type, is_reference&lt;_Tp&gt;::value&gt;::type { }; <\/code><\/pre>\n<p>   \u0418 \u0432\u0441\u0435 \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e <b>union<\/b> \u0432 C++ \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438 \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u00ab\u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043f\u0440\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u00bb, \u0430 \u043e\u0442\u043b\u0438\u0447\u0438\u044f (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442 <b>union<\/b>) \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0435\u0442 \u0445\u0438\u0442\u0440\u044b\u0439 \u043c\u0430\u043d\u0435\u0432\u0440 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f <b>union<\/b> \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0442\u043e\u0433\u0434\u0430 <i>is_class<\/i> \u0431\u0443\u0434\u0435\u0442 \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443.<\/p>\n<p>  \u0412 <a href=\"https:\/\/habr.com\/post\/420365\/\">\u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u044b \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d <i>std::decay<\/i> \u0438 <i>std::common_type<\/i>, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0447\u0442\u043e \u0435\u0449\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 <b>type_traits<\/b>.<\/p>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.<\/p><\/div>\n<p>        <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/post\/418347\/\"> https:\/\/habr.com\/post\/418347\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div data-io-article-url=\"https:\/\/habr.com\/post\/418347\/\" class=\"post__text post__text-html js-mediator-article\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/lr\/zq\/if\/lrzqifvfeajppx2fdvqbxnwf4ce.png\" alt=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.\" width=\"300\" height=\"350\" align=\"left\"> <\/p>\n<h3>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439<\/h3>\n<p>   \u0418\u0437-\u0437\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b C++ 11 \u0438 \u043e\u0442 \u0431\u0435\u0437\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 boost&#8217;\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 C++ 11 \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0439 \u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 C++ 98 \/ C++ 03.<\/p>\n<p>  \u0411\u044b\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b <b>static_assert<\/b>, <b>noexcept<\/b>, <b>countof<\/b>, \u0430 \u0442\u0430\u043a \u0436\u0435, \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0435\u0444\u0430\u0439\u043d\u043e\u0432 \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c. \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0441\u0432\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <b>nullptr<\/b>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>   \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f <b>type_traits<\/b> \u0438 \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u00ab\u043e\u0441\u043e\u0431\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u043c\u0430\u0433\u0438\u0438\u00bb. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u044b \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043c\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043f\u0440\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \u0442\u0435\u0445\u043d\u0438\u043a\u0438 SFINAE \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>   \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 GitHub \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043b\u044f \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0445 \u0438 \u043d\u0435\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439:  <\/p>\n<blockquote><p><b><a href=\"https:\/\/github.com\/oktonion\/stdex\">\u041a\u043e\u043c\u043c\u0438\u0442\u044b \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u0440\u0438\u0442\u0438\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f<\/a><\/b><\/p><\/blockquote>\n<p> \u0411\u043e\u043b\u044c\u0448\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 C++ \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c.  <\/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-287994","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/287994","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=287994"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/287994\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=287994"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=287994"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=287994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}