<?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=427658&amp;view=findpost&amp;p=3867677</guid>
        <pubDate>Mon, 06 Jun 2022 21:33:17 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867677</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427658&view=findpost&p=3867674'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2022-06-06T22:41:23+03:00">06.06.22, 19:41</time></span><div class='quote '>Очень много народу говорит, что профит от CRTP ничтожен по сравнению с геммором от чтения исходников с этой шляпой и последующей разработкой/доработкой.</div></div>Опять же зависит от того, что в него вкладывают. Если речь о статическом полиморфизме как таковом, а ведь вроде с этого тезиса началась тема, то никто бы его тогда не использовал, однако осмотрись вокруг, его полно, и в последние лет 10 его используют чуть ли не чаще обычного динамического. Почитай, любой шаблонный код суть статический полиморфизм, и никакого геморра как-то и близко не наблюдается. Если же речь конкретно о CRTP, то я сразу говорил, что ниша, где он действительно нужен, довольно узка. Так что ничего необычного в выводах не вижу. Если пытаться натянуть сову на глобус, будет больно не только сове.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867674</guid>
        <pubDate>Mon, 06 Jun 2022 19:41:23 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867674</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>Qraizer</strong>. немного прокачал я вопрос. Очень много народу говорит, что профит от CRTP ничтожен по сравнению с геммором от чтения исходников с этой шляпой и последующей разработкой/доработкой. От себя ... и возможно они правы. Если хочешь максимум быстродействия и минимум расходных ресурсов - бери чистый Си. Там реально все под контролем (ни или почти).]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867251</guid>
        <pubDate>Thu, 02 Jun 2022 14:30:08 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867251</link>
        <description><![CDATA[Majestio: Спасибо]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867246</guid>
        <pubDate>Thu, 02 Jun 2022 14:18:46 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867246</link>
        <description><![CDATA[Qraizer: Забыл ещё уточнить. Контейнер методов и this лежали в самом базовом, т.к. каждому производному к ним нужен доступ, и они его получали простым наследованием. Иначе б их можно было хранить в самом производном, и не понадобился бы никакой CRTP. Ну т.е. получилась та самая двунаправленная связь во всей красе. <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="2022-06-02T14:25:00+00:00">02.06.22, 14:25</time></span></span><br>
Вообще, полный код есть на <a class='tag-url' href='https://github.com/qraizer/Multimethods' target='_blank'>githab-е</a>, конкретно в варианте RTTI, но ...как бы так помягче... там полный капут. Около 1000 строк метакода, шаблоны местами в 8-9 параметров, половина из них шаблоны шаблонов... Мультиметоды, они такие. Зато я могу похвастаться, что это самая производительная (Visitor практически так же производителен, как и нативная реалиазция, если б она в языке была) и практически не имеющая ограничений по использованию. Т.е. использовать мультиметоды можно практически так же, как мы привыкли использовать обычные.<br>
У нас на форуме я тут создавал три (вроде бы) темы с их описанием. Можешь поискать, архитектура расписана довольно подробно. В описании на githab есть ссылки, если что.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867243</guid>
        <pubDate>Thu, 02 Jun 2022 14:09:14 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867243</link>
        <description><![CDATA[Majestio: Нормуль, спасибо за пример.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867242</guid>
        <pubDate>Thu, 02 Jun 2022 13:24:12 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867242</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427658&view=findpost&p=3867215'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2022-06-02T08:38:47+00:00">02.06.22, 08:38</time></span><div class='quote '>Ну я не могу это комментировать, т.к. не знаю твоих задач.</div></div>Обычные десктопные приложения.<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427658&view=findpost&p=3867215'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2022-06-02T08:38:47+00:00">02.06.22, 08:38</time></span><div class='quote '>Поэтому я плюнул на все эти формо-ресурсы и весь интерфейс всегда строю программно.</div></div>Значит тебе статика действительно не подходит. В той задаче, где мне нужна была динамика, речь шла о библиотечной функции, поэтому я не мог использовать ресурсы, т.к. в .lib их не засунешь. В остальных случаях обычного редактора ресурсов было за глаза, это и мне удобнее, и пользователю, у него глаза не разбегаются по живому интерфейсу. <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="2022-06-02T13:42:23+00:00">02.06.22, 13:42</time></span></span><br>
Что за CRTP, то из примеров я могу привести только свой. Основная причина необходимости в нём уже указана: когда тебе нужна двунаправленная связь по иерархии – как сверху вниз, так и снизу вверх. В этом случае сверху вниз через обычный полиморфный вызов виртуальных методов, а снизу вверх – через шаблонный параметр CRTP. Это позволяет избежать медленных dynamic_cast&lt;&gt; и ненадёжных в плане того, что проверки будут в runtime. CRTP работает быстро, а корректность чекается в compile time.<br>
В моём примере я строил линейную иерархию классов по списку типов, который передаётся извне пользователем и естественно неизвестен на стадии разработки библиотеки, но известен на момент компиляции. Эта иерархия состояла из классов, являвшихся шаблонными и конкретизированные каждый соответствующим типом из переданного списка. Они в итоге получались унаследованными друг от друга. Каждый такой класс имеет метод, и они все по сути одинаковые, но обрабатывающие данные по-разному, т.к. этим управляет каждый конкретный класс в соответствие со своим типом. И идея была в том, что самый базовый класс в иерархии хранит массив указателей на эти методы и индексирует нужный посредством индексации нужного типа из переданного списка. Ничего сложного, указатели на методы всё решают, но засада была в том, что каждый метод имеет разный тип, т.к. лежит в своём классе, поэтому у них у всех была разная квалификация DerivedClass:: и соответственно каждому должен был приходить уникальный this, который свой собственный. Проблема была решена созданием самого производного класса, к указателю на методы которого все частные указатели и приводились, и то же делалось с this. В итоге самый базовый хранил указатели в едином пространстве MostDerivedClass:: и this тоже указывал на MostDerivedClass, а когда он вызывал конкретный метод из массива, компилятор сам делал нужные неявные восходящие касты и this, и поинтера. Но для этого самому базовому нужно было знать о самом производном, и вот он как раз до него спускался через CRTP.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867215</guid>
        <pubDate>Thu, 02 Jun 2022 08:38:47 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867215</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427658&view=findpost&p=3867184'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T20:26:39+00:00">01.06.22, 20:26</time></span><div class='quote '>Я только один раз за всю сознательную жизнь делал интерфейс динамическим, потому что пришлось. В остальные у меня всё было готово в статике.</div></div><br>
Ну я не могу это комментировать, т.к. не знаю твоих задач. В своих задачах заранее предопределенных форм мне не хватало, как правило. Поэтому я плюнул на все эти формо-ресурсы и весь интерфейс всегда строю программно.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867184</guid>
        <pubDate>Wed, 01 Jun 2022 20:26:39 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867184</link>
        <description><![CDATA[Qraizer: Ты ошибаешься. Я только один раз за всю сознательную жизнь делал интерфейс динамическим, потому что пришлось. В остальные у меня всё было готово в статике. Всё нужное нарисовал, засунул в ресурсы, и грузил нужное в зависимости от потребностей.<br>Qt наследует идиому web-а, которая по своей природе динамическая. Естественно в статику это не переведёшь. Однако возьми любое приложение на нативном WinAPI, и внезапно понимаешь, что у тебя просто нет подходящих библиотек,а самому писать лень.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867179</guid>
        <pubDate>Wed, 01 Jun 2022 18:24:09 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867179</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427658&view=findpost&p=3867175'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T18:13:42+00:00">01.06.22, 18:13</time></span><div class='quote '>С GUI-ём это довольно редко происходит, например.</div></div><br>
Вот тут ты ошибаешься про GUI. Например в Qt с помощью UI можно делать только примитивные интерфейсы. Но если нужно делать что-то более гибкое, к примеру по условию добавить поле, или заменить один контрол на группу в зависимости от условий - только динамическим полиморфизмом это можно реализовать. И это бывает очень часто. Хотя UI из Qt - это просто сахарок от дизайнера форм, но используются потом все те же типы с динамическим полиморфизмом.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867175</guid>
        <pubDate>Wed, 01 Jun 2022 18:13:42 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867175</link>
        <description><![CDATA[Qraizer: А никак. Статика на то и статика. Если тебе нужно в ран-тайме подменять реализации, то статический полиморфизм тебе по определению не подходит. Но вот подумай, а насколько часто ты сталкиваешься с задачей, где подменять поведение нужно в динамике? С GUI-ём это довольно редко происходит, например.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867169</guid>
        <pubDate>Wed, 01 Jun 2022 18:03:41 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867169</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427658&view=findpost&p=3867143'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T16:40:41+00:00">01.06.22, 16:40</time></span><div class='quote '>ATL, к примеру, вся сплошь на шаблонах.</div></div><br>
Вот тут я к примеру не понимаю - а как в рантайме создать элемент, если шаблоны они только при компиляции?]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867143</guid>
        <pubDate>Wed, 01 Jun 2022 16:40:41 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867143</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427658&view=findpost&p=3867110'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T10:46:04+00:00">01.06.22, 10:46</time></span><div class='quote '>Но хотелось бы примеры сабжа, где это действительно дает выхлоп.</div></div>Та ну откуда ж я знаю-то. Я использовал один раз в своей реализации мультиметодов, но это весьма специфическая задача. Я дал общее представление об архитектуре статически полиморфного дерева и описал основой профит, а где это может пригодиться, тут решать каждому самостоятельно.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427658&view=findpost&p=3867110'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T10:46:04+00:00">01.06.22, 10:46</time></span><div class='quote '>Например, для проектирования либы для GUI тут ни разу не катит, а где катит?</div></div>Не факт. ATL, к примеру, вся сплошь на шаблонах. Вполне себе пример. Всё ж зависит от спроектированной тобой архитектуры. Ты вот считаешь, что не катит, потому что не представляешь себе даже примерное виденье иерархической архитектуры, но это не значит, что её не может существовать. <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="2022-06-01T16:44:22+00:00">01.06.22, 16:44</time></span></span><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">#include &lt;iostream&gt;</div><div class="code_line">&nbsp;</div><div class="code_line">class DynaPolyBase</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;virtual void f() const = 0;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">class DynaPolyDerive1: public DynaPolyBase</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;void f() const { std::cout &lt;&lt; &quot;I&#39;m DynaPolyDerive1&quot; &lt;&lt; std::endl; }</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">class DynaPolyDerive2: public DynaPolyBase</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;void f() const { std::cout &lt;&lt; &quot;I&#39;m DynaPolyDerive2&quot; &lt;&lt; std::endl; }</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">void check(const DynaPolyBase&amp; base)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;base.f();</div><div class="code_line">}</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;DynaPolyDerive1 dp11;</div><div class="code_line">&nbsp;&nbsp;DynaPolyDerive2 dp12;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;check(dp11);</div><div class="code_line">&nbsp;&nbsp;check(dp12);</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>А вот для сравнения он же, но статический<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">template &#60;typename D&#62;</div><div class="code_line">class StatPolyBase</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;void f() const { static_cast&#60;const D*&#62;(this)-&#62;f(); }</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">class StatPolyDerive1: public StatPolyBase&#60;StatPolyDerive1&#62;</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;void f() const { std::cout &#60;&#60; &quot;I&#39;m StatPolyDerive1&quot; &#60;&#60; std::endl; }</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">class StatPolyDerive2: public StatPolyBase&#60;StatPolyDerive2&#62;</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;void f() const { std::cout &#60;&#60; &quot;I&#39;m StatPolyDerive2&quot; &#60;&#60; std::endl; }</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename C&#62;</div><div class="code_line">void check(const StatPolyBase&#60;C&#62;&amp; interface)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;interface.f();</div><div class="code_line">}</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;StatPolyDerive1 sp11;</div><div class="code_line">&nbsp;&nbsp;StatPolyDerive2 sp12;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;check(sp11);</div><div class="code_line">&nbsp;&nbsp;check(sp12);</div><div class="code_line">}</div></ol></div></div></div></div>Тут check(), чтобы сохранить полиморфное поведение, тоже должна быть полиморфной и при этом статически, т.е. в данном случае шаблонной. <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="2022-06-01T16:49:04+00:00">01.06.22, 16:49</time></span></span><br>
P.S. Замечу, что как и говорил в начале, базовый класс у StatPolyDeriveX не требуется, достаточно StatPolyBase иметь шаблонный параметр D. CRTP особо полезен в связке динамики и статики, т.е. когда и производные классы наследуют функционал базовых, и базовые получают явные ссылки на производные от них классы.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867142</guid>
        <pubDate>Wed, 01 Jun 2022 16:34:17 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867142</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427658&view=findpost&p=3867133'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T13:19:47+00:00">01.06.22, 13:19</time></span><div class='quote '>Если в классическом полиморфизме между полиморфными классами базовые классы декларируют интерфейсы, которые в дальнейшем и используются, а реализуются они в производных классах, то при статическом всё наоборот: декларирующие интерфейс классы являются самыми производными, а реализуют эти интерфейсы их базовые классы. Это имеет тот профит, что нет необходимости в позднем связывании, т.к. у производных классов уже есть статические связи с унаследованными от базовых классов методами.</div></div><br>
Ну да все верно. Но сабж остается открытым.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867133</guid>
        <pubDate>Wed, 01 Jun 2022 13:19:47 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867133</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427658&view=findpost&p=3867110'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T10:46:04+00:00">01.06.22, 10:46</time></span><div class='quote '>Обычно говорят, что этот подход позволяет реализовать идиому статического полиморфизма.</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;vector&#62;</div><div class="code_line">#include &#60;list&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">class StaticPoly</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;T t;</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;void resize(int x) { t.resize(x); }</div><div class="code_line">};</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;StaticPoly&#60;std::vector&#60;int&#62;&#62; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sp1;</div><div class="code_line">&nbsp;&nbsp;StaticPoly&#60;std::list&#60;std::vector&#60;float&#62;&#62;&#62; &nbsp; sp2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;sp1.resize(123);</div><div class="code_line">&nbsp;&nbsp;sp2.resize(123);</div><div class="code_line">}</div></ol></div></div></div></div>Вообще, понятия статического и динамического полиморфизма не являются академическими, они введены сообществом C++ во времена, когда (внезапно :D ) выяснилось, что шаблоны тоже отвечают принципам полиморфного поведения. Академически есть просто полиморфизм, и он далее классифицируется по методам его реализации, а не признакам и свойствам. Но это так, к слову.<br>
Из-за неакадемичности термина &quot;статический полиморфизм&quot; бывает, что его смысл в разных контекстах не вполне правильно понимается, т.к. у него нет единого формального определения. Конкретно в контексте CRTP он означает дерево иерархии, в котором полиморфная связь между классами перевёрнута &quot;вверх ногами&quot;. Если в классическом полиморфизме между полиморфными классами базовые классы декларируют интерфейсы, которые в дальнейшем и используются, а реализуются они в производных классах, то при статическом всё наоборот: декларирующие интерфейс классы являются самыми производными, а реализуют эти интерфейсы их базовые классы. Это имеет тот профит, что нет необходимости в позднем связывании, т.к. у производных классов уже есть статические связи с унаследованными от базовых классов методами.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867110</guid>
        <pubDate>Wed, 01 Jun 2022 10:46:04 +0000</pubDate>
        <title>Юзкейсы для CRTP</title>
        <link>https://forum.sources.ru/index.php?showtopic=427658&amp;view=findpost&amp;p=3867110</link>
        <description><![CDATA[Majestio: Да, речь идет о CRTP (Странно рекурсивный шаблон). Так, для напоминания:<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;class T&#62;</div><div class="code_line">class Base</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// ...</div><div class="code_line">};</div><div class="code_line">class Derived : public Base&#60;Derived&#62;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// ...</div><div class="code_line">};</div></ol></div></div></div></div><br>
Обычно говорят, что этот подход позволяет реализовать идиому статического полиморфизма.<br>
Ну ок, пусть так. Но хотелось бы примеры сабжа, где это действительно дает выхлоп. <br>
Например, для проектирования либы для GUI тут ни разу не катит, а где катит?]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	