<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795169</guid>
        <pubDate>Tue, 09 Apr 2019 15:50:42 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795169</link>
        <description><![CDATA[Flex Ferrum: Ну, я пытался на ходу что-то путное выдумать.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795167</guid>
        <pubDate>Tue, 09 Apr 2019 15:23:10 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795167</link>
        <description><![CDATA[Qraizer: Если я правильно распознал происходящее, что совсем не факт, то это не совсем то. Смотри.<br>Ты в вариадик Types интегрируешь интерфейс dispIface. Это архитектурная ошибка, т.к. создаёт зависимость классов пользователя от класса абстрактного диспетчера. Это плохо, т.к. диспетчер создаёт интерфейс визитора в процессе своего инстанцирования, поэтому эта зависимость ведёт к циклу. Вместо этого подразумевается, что визит-метод документируется базовым классом в иерархии, и производные его лишь перекрывают, диспетчер же просто зовёт метод базового класса, а не какого-то интерфейса.<br>Далее. Свои внутренние классы акцепторов диспетчер генерирует сам, метаклассы ему для этого не нужны. Поэтому цикл по вариадику по сути лишний. Его следовало бы делать по списку классов в иерархии. Вот его бы получить... К тому же это решение ограничено двупараметрическим мультиметодом, тогда как у меня ещё в C++03 были обобщённые n-параметрические. По списку параметров диспетчер тоже итерируется классически.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795077</guid>
        <pubDate>Mon, 08 Apr 2019 19:50:50 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795077</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3795076'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2019-04-08T19:28:19+00:00">08.04.19, 19:28</time></span><div class='quote '>Парни, я осознаю, что для малоподготовленного (ну как для мня) - вышеприведенное есть лютая дичь.</div></div><br>
Если делать это &quot;старым&quot; способом (и заглянуть под капот) - дичь будет не менее лютая. <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3795076'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2019-04-08T19:28:19+00:00">08.04.19, 19:28</time></span><div class='quote '>Приведите примеры, плс, получаемого профита ...</div></div><br>
Получаемый профит в том, что производимые манипуляции с типами - более явные и (главное) в императивном, а не функциональном стиле. Попробуй реализовать тот же визитор на &quot;обычном&quot; C++ - и поймёшь, о чём речь. :)]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795076</guid>
        <pubDate>Mon, 08 Apr 2019 19:28:19 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795076</link>
        <description><![CDATA[JoeUser: Парни, я осознаю, что для малоподготовленного (ну как для мня) - вышеприведенное есть лютая дичь.<br>Приведите примеры, плс, получаемого профита ... ну или обозначьте границы, когда он действительно может появиться.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795048</guid>
        <pubDate>Mon, 08 Apr 2019 13:56:25 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795048</link>
        <description><![CDATA[Flex Ferrum: А, понял. Смотри, как это может выглядеть:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">template&#60;typename ... Types&#62;</div><div class="code_line">inline void Multimethod(meta::ClassInfo dst, const meta::ClassInfo&amp; src)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;meta::ClassInfo dispIface;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Add extra &#39;Visit&#39; methods to dst dependent on specific type from &#39;Types&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (auto&amp; t : t_$(Types ...))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject_v(dispIface, public) [name=&quot;Dispatch&quot;, is_pure=true](const $_t(t)* obj) {}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$_inject_v(dst, public) dispIface;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;meta::ClassInfo dispImpl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dispImpl.add_base(dispIface);</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto tplParam = dispImpl.add_template_type_param(&quot;T&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$_inject_v(dispImpl, private) { const $_t(tplParam)* m_leftObj;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (auto&amp; t : t_$(Types ...))</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject_v(dispIface, public) [name=&quot;Dispatch&quot;](const $_t(t)* obj) {$_str(Call)($_str(m_leftObj), obj);};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject_v(dst) [name=&quot;Call&quot;](auto* lhs, auto* rhs) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_str(lhs)-&#62;$_mem(&quot;Invoke&quot;)();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// ... и всё в том же духе</div><div class="code_line">&nbsp;&nbsp; &nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$_inject_v(dst, public) dispImpl;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795046</guid>
        <pubDate>Mon, 08 Apr 2019 13:37:49 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795046</link>
        <description><![CDATA[Qraizer: Не. Просто пробую хотя бы представить себе, как бы это выглядело. Нужно генерить объявления<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">virtual typename Proto::ret_type Accept(typename Proto::template getArg&#60;PList&#62;::type &amp;a);</div></ol></div></div></div></div>в нужных классах, определения<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">typename Proto::ret_type Concrete::Accept(typename Proto::template getArg&#60;PList&#62;::type &amp;a){ return static_cast&#60;MultiMethods_Visitor::details::Acceptor&#60;Concrete, typename Proto::ret_type&#62;&amp;&#62;(a).Accept(this); }</div></ol></div></div></div></div>и списки<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">typedef MultiMethods_Visitor::MakeTList&#60;/*...*/&#62; PList;</div></ol></div></div></div></div>в нужных местах единиц трансляции. Пока не вижу явных возможностей для реализации. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-04-08T13:38:49+00:00">08.04.19, 13:38</time></span></span><br>
Для RTTI нужно только последнее. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-04-08T13:39:43+00:00">08.04.19, 13:39</time></span></span><br>
Впрочем, имея последнее, первое два, наверное, реально пропустить через итераторы.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795043</guid>
        <pubDate>Mon, 08 Apr 2019 13:08:59 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795043</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3795042'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-04-08T13:04:00+00:00">08.04.19, 13:04</time></span><div class='quote '>Пока можно лишь частично, генерируя visit-методы.</div></div><br>
Угу. А ты прям на автопрограммисте играешься? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-04-08T13:09:12+00:00">08.04.19, 13:09</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3795042'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-04-08T13:04:00+00:00">08.04.19, 13:04</time></span><div class='quote '>Также к сожалению не получилось разделить объявление и определение visit-метода.<br>
</div></div><br>
Будет позже.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795042</guid>
        <pubDate>Mon, 08 Apr 2019 13:04:00 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795042</link>
        <description><![CDATA[Qraizer: Ну вот я и попытался. Пока можно лишь частично, генерируя visit-методы. Также к сожалению не получилось разделить объявление и определение visit-метода.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795034</guid>
        <pubDate>Mon, 08 Apr 2019 12:06:26 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795034</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3795033'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2019-04-08T12:03:29+00:00">08.04.19, 12:03</time></span><div class='quote '>А по иерархиям классов можно ходить? Чтоб получить src...dst в отношении предок...потомок. <br>
</div></div><br>
Можно (в идеале). Текущая реализация этого пока не поддерживает. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-04-08T12:07:22+00:00">08.04.19, 12:07</time></span></span><br>
О, да, кстати. Твои мультиметоды в этом стиле реализуются более чем тривиально. :)]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795033</guid>
        <pubDate>Mon, 08 Apr 2019 12:03:29 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795033</link>
        <description><![CDATA[Qraizer: А по иерархиям классов можно ходить? Чтоб получить src...dst в отношении предок...потомок. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-04-08T12:04:18+00:00">08.04.19, 12:04</time></span></span><br>
Хотя... а вдруг один ко многим...]]></description>
        <author>Qraizer</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795025</guid>
        <pubDate>Mon, 08 Apr 2019 09:27:29 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3795025</link>
        <description><![CDATA[Flex Ferrum: С++ Russia на подходе, тулза развивается. Приросла таким вот функционалом:<br>
<br>
1. Делаем метакласс, который генерирует visitor для заданного набора типов:<br>
<img class='tag-img' src='https://pbs.twimg.com/media/D3kh6EWWsAAVEz_.png' alt='user posted image'><br>
<br>
2. Делаем инстанс этого метакласса. Всё просто:<br>
<img class='tag-img' src='https://pbs.twimg.com/media/D3kiOEKXoAYhvbT.png' alt='user posted image'><br>
<br>
3. И получаем на выходе хорошенький такой классец-визитор с нужными методами:<br>
<img class='tag-img' src='https://pbs.twimg.com/media/D3kim0pWwAcTnaI.png' alt='user posted image'><br>
<br>
4. Теперь мы лёгким движением руки добавляем к инстансу ещё метакласс Interface:<br>
<img class='tag-img' src='https://pbs.twimg.com/media/D3ki9p5WAAEmy8d.png' alt='user posted image'><br>
<br>
5. И инстанс превращается... Превращается инстанс... В элегантный интерфейсный класс визитора:<br>
<img class='tag-img' src='https://pbs.twimg.com/media/D3kjPDsWsAAXieJ.png' alt='user posted image'><br>
<br>
Вуаля&#33;]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3781861</guid>
        <pubDate>Tue, 30 Oct 2018 10:32:25 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3781861</link>
        <description><![CDATA[Flex Ferrum: В общем, в итоге оно заработало. Итак, что мы имеем.<br>
<br>
1. Два метакласса, описывающие, что именно нужно добавить в класс, чтобы он был сериализуемым с помощью буста:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">$_metaclass(BoostSerializable)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;static void GenerateDecl()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject(public) [&amp;, name=&quot;serialize&quot;](const auto&amp; ar, unsigned int ver) -&#62; void</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_constexpr for (auto&amp; v : $BoostSerializable.variables())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_inject(_) ar &amp; $_v(v.name());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">$_metaclass(BoostSerializableSplitted)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;static void GenerateDecl()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject(public) [&amp;, name=&quot;load&quot;](const auto&amp; ar, unsigned int ver) -&#62; void</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_constexpr for (auto&amp; v : $BoostSerializableSplitted.variables())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_inject(_) ar &#60;&#60; $_v(v.name());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject(public) [&amp;, name=&quot;save&quot;](const auto&amp; ar, unsigned int ver) -&#62; void</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_constexpr for (auto&amp; v : $BoostSerializableSplitted.variables())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_inject(_) ar &#62;&#62; $_v(v.name());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject(public) [&amp;, name=&quot;serialize&quot;](auto&amp; ar, const unsigned int ver) -&#62; void</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;boost::serialization::split_member(ar, $_str(*this), ver);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
Дальше объявляем классы, как обычные структуры. Ну... Почти обычные:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">$_struct(TestStruct, BoostSerializable)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string b;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">$_struct(TestStruct1, BoostSerializableSplitted)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string b;</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
Метапрограммист делает &quot;вжух&quot; и на выходе получается:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class TestStruct {</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;template &#60;typename T0&#62; void serialize(const T0 &amp;ar, unsigned int ver) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;int a;</div><div class="code_line">&nbsp;&nbsp;std::string b;</div><div class="code_line">&nbsp;</div><div class="code_line">protected:</div><div class="code_line">private:</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">class TestStruct1 {</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;template &#60;typename T0&#62; void load(const T0 &amp;ar, unsigned int ver) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &#60;&#60; a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &#60;&#60; b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;template &#60;typename T0&#62; void save(const T0 &amp;ar, unsigned int ver) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &#62;&#62; a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &#62;&#62; b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;template &#60;typename T0&#62; void serialize(T0 &amp;ar, const unsigned int ver) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;boost::serialization::split_member(ar, *this, ver);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;int a;</div><div class="code_line">&nbsp;&nbsp;std::string b;</div><div class="code_line">&nbsp;</div><div class="code_line">protected:</div><div class="code_line">private:</div><div class="code_line">};</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-10-30T10:35:08+00:00">30.10.18, 10:35</time></span></span><br>
Такое вот средство копипасты. Причём, замечу, там ошибка в объявлении типа параметра ar. Изменяем пару мест в объявлении метаклассов:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">$_metaclass(BoostSerializable)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;static void GenerateDecl()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject(public) [&amp;, name=&quot;serialize&quot;](auto&amp; ar, unsigned int ver) -&#62; void</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_constexpr for (auto&amp; v : $BoostSerializable.variables())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_inject(_) ar &amp; $_v(v.name());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">$_metaclass(BoostSerializableSplitted)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;static void GenerateDecl()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject(public) [&amp;, name=&quot;load&quot;](auto&amp; ar, unsigned int ver) -&#62; void</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_constexpr for (auto&amp; v : $BoostSerializableSplitted.variables())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_inject(_) ar &#60;&#60; $_v(v.name());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject(public) [&amp;, name=&quot;save&quot;](auto&amp; ar, unsigned int ver) -&#62; void</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_constexpr for (auto&amp; v : $BoostSerializableSplitted.variables())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$_inject(_) ar &#62;&#62; $_v(v.name());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_inject(public) [&amp;, name=&quot;serialize&quot;](auto&amp; ar, const unsigned int ver) -&#62; void</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;boost::serialization::split_member(ar, $_str(*this), ver);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
Вжух&#33;<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class TestStruct {</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;template &#60;typename T0&#62; void serialize(T0 &amp;ar, unsigned int ver) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;int a;</div><div class="code_line">&nbsp;&nbsp;std::string b;</div><div class="code_line">&nbsp;</div><div class="code_line">protected:</div><div class="code_line">private:</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">class TestStruct1 {</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;template &#60;typename T0&#62; void load(T0 &amp;ar, unsigned int ver) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &#60;&#60; a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &#60;&#60; b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;template &#60;typename T0&#62; void save(T0 &amp;ar, unsigned int ver) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &#62;&#62; a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ar &#62;&#62; b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;template &#60;typename T0&#62; void serialize(T0 &amp;ar, const unsigned int ver) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;boost::serialization::split_member(ar, *this, ver);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;int a;</div><div class="code_line">&nbsp;&nbsp;std::string b;</div><div class="code_line">&nbsp;</div><div class="code_line">protected:</div><div class="code_line">private:</div><div class="code_line">};</div></ol></div></div></div></div>]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3781757</guid>
        <pubDate>Mon, 29 Oct 2018 11:41:49 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3781757</link>
        <description><![CDATA[Flex Ferrum: Продолжаем экзерсизы перед выступлением на CoreHard++. Потихоньку привожу в чувство такой вот код:<br>
<img class='tag-img' src='https://pp.userapi.com/c852132/v852132601/31fc0/AiVBrq3TBoA.jpg' alt='user posted image'>]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3777014</guid>
        <pubDate>Tue, 28 Aug 2018 23:06:09 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3777014</link>
        <description><![CDATA[Flex Ferrum: Итак, первые шаги автопрограммиста по полю метаклассов. Сегодня таки получился end-to-end-тест. Итак.<br>
Объявление метакласса:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">METACLASS_DECL(Interface)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;static void GenerateDecl()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;compiler.message(&quot;Hello world from metaprogrammer!&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;compiler.require($Interface.variables().empty(), &quot;Interface may not contain data members&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (auto&amp; f : $Interface.functions())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;compiler.require(f.is_public(), &quot;Inteface function must be public&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f.make_pure_virtual();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
Его инстанс:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">METACLASS_INST(Interface, TestIface)</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;void TestMethod1();</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string TestMethod2(int param) const;</div><div class="code_line">};</div></ol></div></div></div></div><br>
Что генерирует автопрограммист в соответствии с определением того и другого:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class TestIface {</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;virtual void TestMethod1() = 0;</div><div class="code_line">&nbsp;&nbsp;virtual std::string TestMethod2(int param) const = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">protected:</div><div class="code_line">private:</div><div class="code_line">};</div></ol></div></div></div></div><br>
Ну и как это потом используется в коде:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class TestIfaceImpl : public TestIface</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// TestIface interface</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;void TestMethod1() override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string TestMethod2(int param) const override;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">void TestIfaceImpl::TestMethod1()</div><div class="code_line">{</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">std::string TestIfaceImpl::TestMethod2(int) const</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return &quot;Hello World!&quot;;</div><div class="code_line">}</div></ol></div></div></div></div><br>
Всё настолько прозрачно, насколько это вообще возможно.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776912</guid>
        <pubDate>Mon, 27 Aug 2018 16:30:01 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776912</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776911'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2018-08-27T16:26:10+00:00">27.08.18, 16:26</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776587'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-08-20T22:27:55+00:00">20.08.18, 22:27</time></span><div class='quote '>в Qt я про такое не слышал.</div></div><br>
<a class='tag-url' href='http://doc.qt.io/qt-5/metaobjects.html' target='_blank'>Как-то</a> <a class='tag-url' href='http://doc.qt.io/qt-5/qmetaobject.html' target='_blank'>так</a>, но в подробности я не вдавался.</div></div><br>
Не, это совсем другое. В Qt moc экспозит метаинформацию в райнтайм. Метаклассы же, о которых здесь идёт речь, работают с метаинформацией в compile-time. И могут модифицировать AST.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776911</guid>
        <pubDate>Mon, 27 Aug 2018 16:26:10 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776911</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776587'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-08-20T22:27:55+00:00">20.08.18, 22:27</time></span><div class='quote '>в Qt я про такое не слышал.</div></div><br>
<a class='tag-url' href='http://doc.qt.io/qt-5/metaobjects.html' target='_blank'>Как-то</a> <a class='tag-url' href='http://doc.qt.io/qt-5/qmetaobject.html' target='_blank'>так</a>, но в подробности я не вдавался.]]></description>
        <author>korvin</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776900</guid>
        <pubDate>Mon, 27 Aug 2018 13:24:46 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776900</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776898'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-08-27T13:21:27+00:00">27.08.18, 13:21</time></span><div class='quote '>Только для нативного C++.</div></div><br>
Да, Haxe - считай метаязык. Потом из него можно C++ код получить, как вариант.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776898</guid>
        <pubDate>Mon, 27 Aug 2018 13:21:27 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776898</link>
        <description><![CDATA[Flex Ferrum: Ну куда-то в эту сторону, да. Только для нативного C++.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776896</guid>
        <pubDate>Mon, 27 Aug 2018 13:17:12 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776896</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Flex Ferrum</strong>, глянь плс бегло эту <a class='tag-url' href='https://haxe.org/manual/macro.html' target='_blank'>реализацию макросов</a>. Просто дай оценку. Интересно  :)]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776894</guid>
        <pubDate>Mon, 27 Aug 2018 12:52:03 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776894</link>
        <description><![CDATA[Flex Ferrum: В общем, оно начинает потихоньку дышать:<br>
Для:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">METACLASS_DECL(Interface)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;static void GenerateDecl()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;compiler.message(&quot;Hello world from metaprogrammer!&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;compiler.require($Interface.variables().empty(), &quot;Interface may not contain data members&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (auto&amp; f : $Interface.functions())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;compiler.require(f.is_implicit() || (!f.is_copy_ctor() &amp;&amp; !f.is_move_ctor()), &quot;Interface can&#39;t contain copy or move constructor&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!f.has_access())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f.make_public();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;compiler.require(f.is_public(), &quot;Inteface function must be public&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f.make_pure_virtual();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;static int GenerateImpl()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int a = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return a + 2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">METACLASS_INST(Interface, TestIface)</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;void TestMethod1();</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string TestMethod2(int param) const;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">METACLASS_INST(Interface, BadTestIface)</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;void TestMethod1();</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string TestMethod2(int param) const;</div><div class="code_line">&nbsp;</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp; &nbsp;int m_val;</div><div class="code_line">};</div></ol></div></div></div></div><br>
На консоли можно увидеть:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">### Trying to call &#39;meta::CompilerImpl::message/void message(const char *msg)&#39;</div><div class="code_line">###### Hello world from metaprogrammer!</div><div class="code_line">### Trying to call &#39;meta::CompilerImpl::require/void require(bool, const char *message)&#39;</div><div class="code_line">...</div><div class="code_line">### Trying to call &#39;meta::CompilerImpl::message/void message(const char *msg)&#39;</div><div class="code_line">###### Hello world from metaprogrammer!</div><div class="code_line">### Trying to call &#39;meta::CompilerImpl::require/void require(bool, const char *message)&#39;</div><div class="code_line">###### Interface may not contain data members</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-08-27T12:52:34+00:00">27.08.18, 12:52</time></span></span><br>
Теперь борюсь с range-for.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776587</guid>
        <pubDate>Mon, 20 Aug 2018 22:27:55 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776587</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776586'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2018-08-20T22:24:53+00:00">20.08.18, 22:24</time></span><div class='quote '>Это те метаклассы, которые, как минимум в CLOS с 1994-го? Да и в Qt они вроде давно есть. В чём взрыв-то?</div></div><br>
Про CLOS не в курсе, а в Qt я про такое не слышал.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776586</guid>
        <pubDate>Mon, 20 Aug 2018 22:24:53 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776586</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774231'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T10:24:19+00:00">17.07.18, 10:24</time></span><div class='quote '>в прошлом году на конфах некто Герб Саттер взорвал C++-общественность докладами про метаклассы</div></div><br>
Это те метаклассы, которые, как минимум в CLOS с 1994-го? Да и в Qt они вроде давно есть. В чём взрыв-то?]]></description>
        <author>korvin</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776416</guid>
        <pubDate>Fri, 17 Aug 2018 15:52:14 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776416</link>
        <description><![CDATA[Flex Ferrum: Не хотел я в первый релиз Jinja2 затаскивать макросы. Но без них будет определённо тоскливо...<br>
<img class='tag-img' src='https://pp.userapi.com/c844722/v844722763/caef4/1UU5YbWeXUM.jpg' alt='user posted image'><br>
<br>
А такого меташаблонного кода в реализации автопрограммиста будет в достатке...]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776037</guid>
        <pubDate>Fri, 10 Aug 2018 18:28:00 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776037</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776029'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2018-08-10T17:44:32+00:00">10.08.18, 17:44</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776022'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-08-10T16:06:09+00:00">10.08.18, 16:06</time></span><div class='quote '>Мы должны пойти глубже.</div></div><br>
ИМХО, нужно начинать с ТУ, делать ТЗ, и только потом прогать и докать сделанное.</div></div><br>
Так в первом посте ссылка на пропозал соответствующий. :)]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776029</guid>
        <pubDate>Fri, 10 Aug 2018 17:44:32 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776029</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776022'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-08-10T16:06:09+00:00">10.08.18, 16:06</time></span><div class='quote '>Мы должны пойти глубже.</div></div><br>
ИМХО, нужно начинать с ТУ, делать ТЗ, и только потом прогать и докать сделанное.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776022</guid>
        <pubDate>Fri, 10 Aug 2018 16:06:09 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776022</link>
        <description><![CDATA[Flex Ferrum: Я для себя тоже такой язык нашёл - Jinja2. Даже его порт с питона на С++ сделал. Но... Мы должны пойти глубже. :)]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776019</guid>
        <pubDate>Fri, 10 Aug 2018 15:15:30 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776019</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776018'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-08-10T14:54:09+00:00">10.08.18, 14:54</time></span><div class='quote '>Ну, эммм... Именно это я и нацелился написать. Утилиту, которая внутри себя интерпретирует часть C++-текста и генерирует на его основе новый текст</div></div><br>
Хм :scratch: Идея оч-оч интересная. Но не покидает ощущение де жа вю&#33;&#33;&#33;<br>
<br>
Чисто про хронологии ....<br>
<br>
<strong class='tag-b'>1993 год.</strong> Прихожу я на фирму новичком. Сам из себя такой матеро-запаскалевший, ориентированный чисто объектно. За плечами asm-либа работы с окнами в режиме CGA/EGA/VGA, даже &quot;снег&quot; снимал на CGA на основе обратного хода луча ... А мне нач отдела заявляет - все херня, учи <a class='tag-url' href='https://ru.wikipedia.org/wiki/Clarion_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)' target='_blank'>Clarion</a>. Я туда, я сюда, да как так, да я ... проиграл я ему на простейшей задаче, вчистую&#33;&#33;&#33; Сел и выучил посля Clarion.<br>
<br>
Чем интересен язык? Язык шаблонов шаблонов ... шаблонов. Каркас очередного модуля собирается единожды, определяются entry сниппетов, а вот там уже дальше ад и израиль. Если честно, по IDE клариона скучаю.<br>
<br>
<strong class='tag-b'>2018 год.</strong> Познакомился с языком шаблонов <a class='tag-url' href='https://laravel.com/docs/5.6/blade' target='_blank'>Blade</a>. Тоже свой цымус. Понятко что, для чего, и как. Реализация приятная и красивая.<br>
<br>
Лично мое имховое резюме: я против усложнения Стандарта языка C++. Но я строго &quot;за&quot; за создание мета-систем генерации кода, реализации метасистем на основе паттернов проектирования. Вот как-то так  :-?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776018</guid>
        <pubDate>Fri, 10 Aug 2018 14:54:09 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776018</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776017'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2018-08-10T14:47:57+00:00">10.08.18, 14:47</time></span><div class='quote '>ты меня наталкиваешь на мысль, а-ля moc Qt. Сам посуди. С++ явно пока несовершенен. Берем язык сверхвысогого уровня (хотя можно и тот же C++), строим информационную модель, реализовываем ее в рамках языка программирования более низкого уровня. Профит&#33;&#33;&#33;<br>
</div></div><br>
Ну, эммм... Именно это я и нацелился написать. Утилиту, которая внутри себя интерпретирует часть C++-текста и генерирует на его основе новый текст. То есть, скажем, результатом обработки кода из этого коммента: <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3775986' target='_blank'>Метаклассы в C++ (сообщение #3775986)</a> будет:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class TestIface</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void TestMethod1() = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual std::string TestMethod2(int param) const = 0;</div><div class="code_line">};</div></ol></div></div></div></div><br>
Но это - самые простейшие преобразования. Можно добавить наследование от некоего IObject, скажем. Или сделать так, чтобы методы были преобразованы так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class TestIface</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual result_t TestMethod1() nothrow = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual result_t TestMethod2(int param, std::string&amp; returnVal) const nothrow = 0;</div><div class="code_line">};</div></ol></div></div></div></div><br>
Причём, замена одного другим может быть сделана в одном лишь месте - в определении метакласса. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-08-10T15:02:53+00:00">10.08.18, 15:02</time></span></span><br>
Или, скажем, определяешь ты метакласс Component:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">template&#60;typename ImplIfaces, typename RequireIfaces, typename HiddenIfaces = List&#60;&#62;&#62;</div><div class="code_line">$class Component</div><div class="code_line">{</div><div class="code_line">// Реализацию сходу не напишу</div><div class="code_line">};</div></ol></div></div></div></div><br>
Потом пишешь:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">$Component&#60;List&#60;I1, I2&#62;, List&#60;I3, I4&#62;&#62; SomeComponent</div><div class="code_line">{</div><div class="code_line">//.. </div><div class="code_line">};</div></ol></div></div></div></div><br>
А он тебе генерирует:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class SomeComponent : public I1, public I2, public ComponentBase</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;Component(I3*, I4*) {}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;enum {ComponentId = 0xffffff;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;const std::string&amp; GetComponentName() {return &quot;SomeComponent&quot;;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Реализация</div><div class="code_line">};</div></ol></div></div></div></div>]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776017</guid>
        <pubDate>Fri, 10 Aug 2018 14:47:57 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776017</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Flex Ferrum</strong>, ты меня наталкиваешь на мысль, а-ля moc Qt. Сам посуди. С++ явно пока несовершенен. Берем язык сверхвысогого уровня (хотя можно и тот же C++), строим информационную модель, реализовываем ее в рамках языка программирования более низкого уровня. Профит&#33;&#33;&#33;<br>
<br>
Кстати&#33; Некое подобие сказанного уже в стадии реализации - <a class='tag-url' href='https://ru.wikipedia.org/wiki/Haxe' target='_blank'>Haxe</a>. Понимаю, все не так и не то. Но я говорю про концепцию. ИМХО право на жысть имеет. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-08-10T14:49:38+00:00">10.08.18, 14:49</time></span></span><br>
ЗЫ: Чего действительно в haxe не хватает - так это ... увы мета  :-?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776015</guid>
        <pubDate>Fri, 10 Aug 2018 14:29:32 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776015</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3776008'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2018-08-10T13:40:09+00:00">10.08.18, 13:40</time></span><div class='quote '>Это откуда инфа?</div></div><br>
Это от меня. В рамках моей реализации. :) Ну а примеры... Вот, скажем, задачка с visitor&#39;ом:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// Базовый класс для visitable-классов</div><div class="code_line">template&#60;typename V, typename R = void&#62;</div><div class="code_line">struct VisitableBase</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual R Visit(V* v) = 0;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60;typename V, typename R = void&#62;</div><div class="code_line">$class Visitable</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;constexpr</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // Добавляем метод Visit в визитируемый класс</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; -&#62; R Visit(V* v) override {return v-&#62;Visit(*this);}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // Добавляем наследование</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; $Visitable.add_parent(VisitableBase&#60;V, R&#62;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">class SampleVisitor;</div><div class="code_line">Visitable&#60;SampleVisitor&#62; Foo</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">// Тут ничего лишнего не пишем</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">Visitable&#60;SampleVisitor&#62; Bar</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">// Тут ничего лишнего не пишем</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// Объявляем класс-визитор</div><div class="code_line">class SampleVisitor</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;void Visit(const Foo&amp;) {std::cout &#60;&#60; &quot;SampleVisitor::Visit(Foo)\n&quot;;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;void Visit(const Bar&amp;) {std::cout &#60;&#60; &quot;SampleVisitor::Visit(Bar)\n&quot;;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
В данном случае метакласс Visitable приведёт объявления классов Foo и Bar к виду, пригодному к обходу заданным визитором.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776008</guid>
        <pubDate>Fri, 10 Aug 2018 13:40:09 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3776008</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3775986'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-08-10T09:32:42+00:00">10.08.18, 09:32</time></span><div class='quote '>Вид метаклассов, близкий к финальному.</div></div><br>
Это откуда инфа?<br>
Флекс, давай представим что метаклассы реализованы и самодостаточны. Приведи, пожалуйста, пример - где они &quot;решают&quot;. Где реально без них содом и гомора? Чисто чтобы осознать глубину глубин.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3775986</guid>
        <pubDate>Fri, 10 Aug 2018 09:32:42 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3775986</link>
        <description><![CDATA[Flex Ferrum: Вид метаклассов, близкий к финальному.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">METACLASS_DECL(Interface)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;static void GenerateDecl()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;compiler.require($Interface.variables().empty(), &quot;Interface may not contain data members&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (auto&amp; f : $Interface.functions())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;compiler.require(!f.is_copy() &amp;&amp; !f.is_move(), &quot;Interface can&#39;t contain copy or move constructor&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!f.has_access())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f.make_public();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;compiler.require(f.is_public(), &quot;Inteface function must be public&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f.make_pure_virtual();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">METACLASS_INST(Interface, TestIface)</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;void TestMethod1();</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string TestMethod2(int param) const;</div><div class="code_line">};</div></ol></div></div></div></div><br>
Осталось только интерпретатор всего этого хозяйства напедалить.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774342</guid>
        <pubDate>Wed, 18 Jul 2018 13:24:29 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774342</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774268'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T15:28:39+00:00">17.07.18, 15:28</time></span><div class='quote '>Вообще без напряга. Там переполнения после 47-го элемента, естественно, не суть. </div></div><br>
Да, а про constexpr я и забыл :blush:]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774270</guid>
        <pubDate>Tue, 17 Jul 2018 15:48:10 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774270</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774269'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T15:36:31+00:00">17.07.18, 15:36</time></span><div class='quote '>Вопрос &quot;что, зачем и какими силами&quot; воспроизводится?&#33; <br>
Хорошо, если упрощает, а несли нет???&#33;<br>
А если это вааще не упало щяс???</div></div><br>
Тут вот какое дело. Если для решения довольно простых задач (скажем, пресловутого конвертора строк в enum&#39;ы) надо городить огород со сторонними утилитами - тут, эммм..., что-то не так в консерватории. В языке, в смысле. Метаклассы закрывают эту &quot;дыру&quot; и позволяют более гибко управлять процессом компиляции (в смысле, вмешиваться в работу компилятора) легальным способом получая нужные бенифиты. И это - здорово&#33; <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-07-17T15:50:55+00:00">17.07.18, 15:50</time></span></span><br>
В любом случае: не попробуешь - не узнаешь. Вот я и хочу попробовать. Впрочем, уже сейчас (на этапе предварительного анализа подхода и реализации) вижу интересные вопросы, на которые в пропозале нет ответа...]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774269</guid>
        <pubDate>Tue, 17 Jul 2018 15:36:31 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774269</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774263'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T14:55:47+00:00">17.07.18, 14:55</time></span><div class='quote '>Тут &quot;немножко&quot; другой подход. Проблема с метапрограммированием на шаблонах в том, что &quot;язык&quot; шаблонов ближе к функциональному, а его тьюринг-полнота основана на рекурсии.</div></div><br>
<strong class='tag-b'>Флекс</strong>, давай отделять мух от котлет&#33; Я понимаю, движется все. Се ля ви. Но предлагаю очень не забывать о <a class='tag-url' href='https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9F%D0%B0%D1%80%D0%B5%D1%82%D0%BE' target='_blank'>принципе Паретто</a>. Конечно, любые телодвижения в развитии важны&#33; Но соотнеси их к вышеозначенному принципу&#33; ...<br>
<br>
Вопрос &quot;что, зачем и какими силами&quot; воспроизводится?&#33; <br>
Хорошо, если упрощает, а несли нет???&#33;<br>
А если это вааще не упало щяс???]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774268</guid>
        <pubDate>Tue, 17 Jul 2018 15:28:39 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774268</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774261'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T13:28:39+00:00">17.07.18, 13:28</time></span><div class='quote '>Попробуй, чисто ради эксперимента, заинициализировать свой массив (вектор) из 16192 элемента в статике числами Фибоначчи. </div></div><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int a[16192];</div><div class="code_line">&nbsp;</div><div class="code_line">constexpr int fun()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;a[0] = 0;</div><div class="code_line">&nbsp;&nbsp;a[1] = 1;</div><div class="code_line">&nbsp;&nbsp;for (int i = 2; i &#60; 16192; ++i) a[i] = a[i-2] + a[i-1];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int x = fun();</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;for (auto&amp; i : a) std::cout &#60;&#60; i &#60;&#60; &#39; &#39;;</div><div class="code_line">}</div></ol></div></div></div></div>Вообще без напряга. Там переполнения после 47-го элемента, естественно, не суть.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774263</guid>
        <pubDate>Tue, 17 Jul 2018 14:55:47 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774263</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774261'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T13:28:39+00:00">17.07.18, 13:28</time></span><div class='quote '>Я уже как-то генерировал тест с &quot;а-ля&quot; 4096-вложенными классами. Без специальных ключей - включалось все&#33;<br>
Попробуй, чисто ради эксперимента, заинициализировать свой массив (вектор) из 16192 элемента в статике числами Фибоначчи. </div></div><br>
Тут &quot;немножко&quot; другой подход. Проблема с метапрограммированием на шаблонах в том, что &quot;язык&quot; шаблонов ближе к функциональному, а его тьюринг-полнота основана на рекурсии. Поэтому задачи обработки глубоко вложенных конструкций и прочего таки встаёт. Рано или поздно. Когда ты понимаешь, что двадцати гигабайт памяти тебе уже не хватает для компиляции TensorFlow. :D C constexpr-вычислениями чуть другое. Компиляторную бомбу всё равно ещё можно сделать, но так или иначе, компилятор уже не только компилятор, но и интерпретатор, который тупо интерпретирует им самим же построенное AST. Поэтому всё становится проще, как с точки зрения программирования, так и с точки зрения компиляции. И эта часть языка (и стандарта) развивается очень активно - с constexpr-функций снимается всё больше ограничений (вспомни, какими они были в 11-ом стандарте), в двадцатом уже обещают строгий constexpr (который <strong class='tag-b'>constexpr&#33;</strong>), выполняющийся либо строго в компайл-тайм, либо не выполняющийся вообще.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774261</guid>
        <pubDate>Tue, 17 Jul 2018 13:28:39 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774261</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774259'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T13:21:03+00:00">17.07.18, 13:21</time></span><div class='quote '>Скорее, времени компиляции.</div></div><br>
Э нееее ....&#33;&#33;&#33;&#33;  :lol: <br>
Я уже как-то генерировал тест с &quot;а-ля&quot; 4096-вложенными классами. Без специальных ключей - включалось все&#33;<br>
Попробуй, чисто ради эксперимента, заинициализировать свой массив (вектор) из 16192 элемента в статике числами Фибоначчи. <br>
А потом попробуй динамически. Просто чуйка шепчет - не сильно, не ощутимо быстрее. А вот экзешник - посчитать надо.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774259</guid>
        <pubDate>Tue, 17 Jul 2018 13:21:03 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774259</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774258'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T13:19:22+00:00">17.07.18, 13:19</time></span><div class='quote '>1) Статическая инициализация сверх-большой структуры - приведет в увеличению кода значительно.</div></div><br>
Скорее, времени компиляции. Ведь код метаклассов исполняется в compile time. Это contsexpr на стеродиах и анаболиках. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-07-17T13:21:58+00:00">17.07.18, 13:21</time></span></span><br>
Я, собственно, и выбрал третий путь - утилита будет внутри себя исполнять этот код и продуцировать &quot;исправленный&quot; C++-исходник.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774258</guid>
        <pubDate>Tue, 17 Jul 2018 13:19:22 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774258</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Flex Ferrum</strong>, увы, в силу моих теперешних знаний, аналогов не вижу.<br>
И тем не менее есть моменты:<br>
<br>
1) Статическая инициализация сверх-большой структуры - приведет в увеличению кода значительно.<br>
2) Динамическая инициализация сверх-большой структуры - приведет к небольшому проседанию &quot;старта&quot; при условии быстрых вычислений.<br>
3) Можно пойти путями &quot;bison/flex&quot;, сперва вычисляем - потом постим в код<br>
4) C++ way в Rust - наверняка есть, призываю духов <strong class='tag-b'>D_KEY</strong> и <strong class='tag-b'>OpenGL</strong>]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774254</guid>
        <pubDate>Tue, 17 Jul 2018 12:49:34 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774254</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774248'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T12:19:46+00:00">17.07.18, 12:19</time></span><div class='quote '>Более того, это забивает основной вопрос&#33; Типа, чонадо?&#33;</div></div><br>
Ну смотри. Ты описываешь структуру:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">FlagType {auto in, out, trunk, create, open};</div></ol></div></div></div></div><br>
Дальше описываешь метакласс, который делает примерно следующее:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">$class FlagType</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;constexpr</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int curValue = 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (auto m : FlagType.members)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.SetValue(curValue);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; curValue &#60;&#60;= 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><br>
То есть код метакласса обходит все мемберы &quot;своего&quot; класса и каждому присваивает значение.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774248</guid>
        <pubDate>Tue, 17 Jul 2018 12:19:46 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774248</link>
        <description><![CDATA[JoeUser: Флекс, там слишком много буквоф&#33;&#33;&#33; :( <br>
Смысла прописывать операции, близкие по действию - не вижу.<br>
Более того, это забивает основной вопрос&#33; Типа, чонадо?&#33;<br>
Прошу &quot;синтетический&quot; пример, где есть только реализация &quot;вопрошаемого&quot; и ничего более. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-07-17T12:24:19+00:00">17.07.18, 12:24</time></span></span><br>
И еще момент - на сколько я понял, искать аналоги &quot;решений&quot; для Раста, базируясь на идеологии С++ - это неправильно.<br>
Правильно искать решения задачи на этих ЯП - пусть и чаще совсем непохожие друг на друга.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774245</guid>
        <pubDate>Tue, 17 Jul 2018 12:14:33 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774245</link>
        <description><![CDATA[Flex Ferrum: Пример... Да вот хотя бы в моём посте на картинке.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774242</guid>
        <pubDate>Tue, 17 Jul 2018 12:09:53 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774242</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774240'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T12:02:16+00:00">17.07.18, 12:02</time></span><div class='quote '>А трейт для структуры ты реализуешь сам (ручками) или можешь обобщённый код на основе reflection&#39;а написать?</div></div><br>
Боюсь ошибиться (надо папиков Раста спрашивать). Но в Расте гораздо больше чем мне казалось - является шаблонами. Даже элементарное объявление &quot;let mut str = &quot;string&quot; - является  шаблоном. Чтобы ответить однозначно - приведи код на С++, если C++ не умеет - приведи псевдомашинный код чего хотелось.<br>
<br>
Пока могу сказать одно ... Трэйты, объекты-трэйты, и трэйт-имплементации в Расте - параметризуются.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774240</guid>
        <pubDate>Tue, 17 Jul 2018 12:02:16 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774240</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774238'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T11:53:24+00:00">17.07.18, 11:53</time></span><div class='quote '>В Расте пишется трэйт Serializе. Который определяет обязательные методы serialize()/deserialize(). Как только будет произведена имплементация данного трэйта для хотя бы для одной структуры - мы можем использовать &quot;контейнеры&quot;, к примеру, в которых будут использованы объекты, поддерживающие поведение&quot;Serialize&quot;.</div></div><br>
А трейт для структуры ты реализуешь сам (ручками) или можешь обобщённый код на основе reflection&#39;а написать?]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774238</guid>
        <pubDate>Tue, 17 Jul 2018 11:53:24 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774238</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774235'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T10:57:01+00:00">17.07.18, 10:57</time></span><div class='quote '>Создаёшь метакласс Component, в нём описываешь - как генерируется метаинформация о связывании компонента, какие дополнительные методы в реализацию компонента вдвигаются и т. п.</div></div><br>
Честно говоря - слишком размыто. Пока не отвечу, пока не понимаю чего надо.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413223&view=findpost&p=3774235'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2018-07-17T10:57:01+00:00">17.07.18, 10:57</time></span><div class='quote '>Или, положим, пишешь метакласс SerializableStruct, который добавляет в структуру методы сериализации/десериализации.</div></div><br>
В Расте пишется трэйт Serializе. Который определяет обязательные методы serialize()/deserialize(). Как только будет произведена имплементация данного трэйта для хотя бы для одной структуры - мы можем использовать &quot;контейнеры&quot;, к примеру, в которых будут использованы объекты, поддерживающие поведение&quot;Serialize&quot;. Дальше уже компайлер определяет - можем ли мы заполнять контейнер конкретным классом, либо у него не хватает реализации (методов) для конкретного поведения Serializе.<br>
<br>
Пока - все ровное, не  :lol: <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-07-17T11:55:55+00:00">17.07.18, 11:55</time></span></span><br>
PS: Ни кто не против, что я сюда частично обсуждение ЯП Rust приплел? :-?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774235</guid>
        <pubDate>Tue, 17 Jul 2018 10:57:01 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774235</link>
        <description><![CDATA[Flex Ferrum: <strong class='tag-b'>JoeUser</strong>, ну, судя чисто по тому, что ты описал - это не совсем метаклассы (в понимании Саттера). Идея Саттера - &quot;прокачать&quot; шаблоны, концепты и статический рефлекшн (генеративный) так, чтобы из C++-кода можно было управлять генерацией AST. Это больше похоже на макросы из Nemerle. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2018-07-17T11:00:10+00:00">17.07.18, 11:00</time></span></span><br>
То есть, скажем, пишешь ты очередную либу типа Dependency Ijection. Создаёшь метакласс Component, в нём описываешь - как генерируется метаинформация о связывании компонента, какие дополнительные методы в реализацию компонента вдвигаются и т. п. Или, положим, пишешь метакласс SerializableStruct, который добавляет в структуру методы сериализации/десериализации.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774234</guid>
        <pubDate>Tue, 17 Jul 2018 10:44:47 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774234</link>
        <description><![CDATA[JoeUser: <div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><strong class='tag-b'>Flex Ferrum</strong>,  :lol: <br>
<br>
Ой, Флекс, прямо де жа вю. Недавно закончил читать доку по Расту - в аккурат концепция трэйтов тамошних. Один в один&#33; <br>
Так, для справки напомню, ну и в меру моей &quot;одноразовой&quot; компетенции ... В Расте многие концепции ООП решаются совсем иначе классики С++/OOP Pascal/etc<br>
<br>
1) Структуры - хранят только данные, наследования данных нет (но есть композиция и агрегация)<br>
2) Реализации - хранят код &quot;методов&quot; для обработки данных смежной структуры<br>
3) Трэйты - хранят &quot;поведение&quot;, иными словами декларацию обязательно реализованных методов для отдельного поведения<br>
4) Реализация трэйтов - понятное дело, реализация методов трэйта для структуры<br>
6) Трэйты-объекты - предназначены для обеспечения динамической диспетчеризации (пока я механизм не осознал, прочел чисто концепцию).Типа Box&lt;T:Display&gt; обозначает ссылку на любой тип, реализующий трэйт Display<br>
<br>
Получается что? :lol: Что в С++ к 23-26 году таки затащят то, что сейчас есть в Расте??? :lol: <br>
<br>
<strong class='tag-b'>D_KEY</strong>, <strong class='tag-b'>OpenGL</strong>, плс, правьте - если я где-то ашыпся&#33; :-? <br>
</div></div>]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774231</guid>
        <pubDate>Tue, 17 Jul 2018 10:24:19 +0000</pubDate>
        <title>Метаклассы в C++</title>
        <link>https://forum.sources.ru/index.php?showtopic=413223&amp;view=findpost&amp;p=3774231</link>
        <description><![CDATA[Flex Ferrum: Если кто помнит (а кто не помнит - тем напомню) в прошлом году на конфах некто Герб Саттер взорвал C++-общественность докладами про метаклассы:<br>
<a class='tag-url' href='https://www.youtube.com/watch?v=6nsyX37nsRs' target='_blank'>https://www.youtube.com/watch?v=6nsyX37nsRs</a><br>
<br>
Если вкратце, программист описывает некий метакласс (например, Value или BitFields), в нём определяет определяет констрейнты, связанные с этим метаклассом, какие методы/поля надо ещё добавить, а потом компилятор соответствующим образом модифицирует AST для экземпляров этого метакласса:<br>
<span class="b-attach" data-size="165742" data-hits="1548" data-attach-id="58946" data-attach-post-id="3774231">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3774231&amp;attach_id=58946' title='Скачать файл' target='_blank'>metaclass_sample.png</a> (, : 1548)
		</span><br>
<br>
Подробности описаны <a class='tag-url' href='http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0707r0.pdf' target='_blank'>здесь</a>.<br>
<br>
Всё бы ничего, но в стандарт это затащат не раньше 23-го года. А то и 26-го. До этого ещё static reflection должны принять и всё такое. В общем, долго ещё ждать. А вот пощупать уже сейчас хочется, поэтому решил я из своего <a class='tag-url' href='https://github.com/flexferrum/autoprogrammer' target='_blank'>автопрограммиста</a> сделать автометапрограммиста. Чтобы мог похожую функциональность предоставить в рамках актуальных стандартов всем желающим, а не только тем, кто сидит на кастомных сборках clang&#39;а. Пока предполагаю, что код, который нужно будет непосредственно писать разработчику, будет выглядеть как-то так:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// Объявление метакласса</div><div class="code_line">METACLASS_DECL(interface)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;enum Type</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;One = 1,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Two,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Three</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;static void generate(interface* instance)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Проверка свойств конкретного инстанса метакласса</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;compiler.require(instance != nullptr, &quot;Class instance is NULL!&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Инжект в тело метакласса какого-то кода</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;META_INJECT {int member;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// Инстанс метакласса</div><div class="code_line">METACLASS_INST(interface, IObject)</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;int AddRef();</div><div class="code_line">&nbsp;&nbsp; &nbsp;int Release();</div><div class="code_line">&nbsp;&nbsp; &nbsp;IObject* QueryInterface(uint32_t ifaceId);</div><div class="code_line">};</div></ol></div></div></div></div>]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Прочее</category>
      </item>
	
      </channel>
      </rss>
	