<?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=431434&amp;view=findpost&amp;p=3883765</guid>
        <pubDate>Fri, 23 Dec 2022 19:48:17 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883765</link>
        <description><![CDATA[Majestio: Ну да, такое ближе к истине. А то я уже распереживался за динамику, чуть чяем не облился  :lol:]]></description>
        <author>Majestio</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883762</guid>
        <pubDate>Fri, 23 Dec 2022 17:16:51 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883762</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3883761'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2022-12-23T17:00:09+00:00">23.12.22, 17:00</time></span><div class='quote '>Я попробовал твой пример прогнать в <a class='tag-url' href='https://www.onlinegdb.com' target='_blank'>https://www.onlinegdb.com</a>, выбрал там стандарт С++20, чет он заругался на твой код в отдельных местах. Ну не суть, я подредактировал.</div></div>В каких? Концепты не понял? С++20 в полной мере могут не все поддерживать. Та ну и хрен с ними, статика и на утиных работать будет, ей явно объявленные интерфейсы необязательны.<br>
Но ты прав, я сутрировал конечно. Намерено, причём. Включи оптимизацию и познай дзен inline, как говорится. ;) <br>
Твой пример ближе к истине, но тут такое дело... в общем, предсказатель переходов у современных процессоров всё равно не даст нормально потестить разницу в производительности между статически и динамически связанными вызовами. Надо как-то рандомизировать адресаты, чтобы у предсказателя побольше промахов было, иначе даже косвенные вызовы будут связаны статически, но в кэше процессора. И если для динамики это раз плюнуть, то вот для статики...<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="2022-12-23T17:24:29+00:00">23.12.22, 17:24</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">543405900ns</div><div class="code_line">578759500ns</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>Это я уменьшил количество вызовов в 10 раз. Вот вам воочию работа предсказателя: более чем 10 кратный штраф за сбросы конвейера. <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-12-23T17:35:35+00:00">23.12.22, 17:35</time></span></span><br>
P.S. Ну не совсем, всё-таки. Код теперь выглядит примерно вот так:<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 C&#62;</div><div class="code_line">auto doIt(const C&amp; c)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;auto start = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;c.doIt();</div><div class="code_line">&nbsp;&nbsp;return std::chrono::high_resolution_clock::now() - start;</div><div class="code_line">}</div><div class="code_line">/* ... */</div><div class="code_line">&nbsp;&nbsp;StatPolyBase&#60;StatPolyDerived1&#62; itemS1;</div><div class="code_line">&nbsp;&nbsp;StatPolyBase&#60;StatPolyDerived2&#62; itemS2;</div><div class="code_line">&nbsp;&nbsp;StatPolyBase&#60;StatPolyDerived3&#62; itemS3;</div><div class="code_line">&nbsp;&nbsp;DynaPolyDerived1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*itemD1 = new DynaPolyDerived1;</div><div class="code_line">&nbsp;&nbsp;DynaPolyDerived2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*itemD2 = new DynaPolyDerived2;</div><div class="code_line">&nbsp;&nbsp;DynaPolyDerived3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*itemD3 = new DynaPolyDerived3;</div><div class="code_line">&nbsp;&nbsp;std::array&#60;DynaPolyBase*, 3&#62; &nbsp; items = { itemD1, itemD2, itemD3 };</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::random_device &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rd;</div><div class="code_line">&nbsp;&nbsp;std::mt19937 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gen(rd());</div><div class="code_line">&nbsp;&nbsp;std::uniform_int_distribution&#60;&#62; distrib(0, 2);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;decltype(doIt(itemS1)) time = decltype(time)::zero();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// статика</div><div class="code_line">&nbsp;&nbsp;for (int i = 0; i &#60; 10000000; ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;switch (distrib(gen))</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;case 0: time += doIt(itemS1); break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;case 1: time += doIt(itemS2); break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;case 2: time += doIt(itemS3); break;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">/* ... */</div><div class="code_line">&nbsp;&nbsp;// динамика</div><div class="code_line">&nbsp;&nbsp;for (int i = 0; i &#60; 10000000; ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;time += doIt(*items[distrib(gen)]);</div><div class="code_line">&nbsp;&nbsp;delete itemD1;</div><div class="code_line">&nbsp;&nbsp;delete itemD2;</div><div class="code_line">&nbsp;&nbsp;delete itemD3;</div></ol></div></div></div></div>Т.е. в эти 10 крат входят также вызовы рандом-генератора и службы времени. Так что не всё таки так уж и плохо без предсказателя. <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-12-23T18:04:32+00:00">23.12.22, 18:04</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">547698900ns</div><div class="code_line">833802200ns</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">700369200ns</div><div class="code_line">1015749800ns</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">664954600ns</div><div class="code_line">962311400ns</div></ol></div></div></div></div>Тут учитывается оверхед самого вызова std::chrono::high_resolution_clock::now(), усреднённый по миллиарду вызовов. И циклы снова увеличены до миллиарда.<br>
Но надо понимать, что если у вас нет аппаратной защиты от всяких там <a class='tag-url' href='https://ru.wikipedia.org/wiki/Spectre_(%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C)' target='_blank'>Spectre</a> и вместо стоят программные патчи, то эта синтетика будет показывать попугаев вместо наносекунд.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883761</guid>
        <pubDate>Fri, 23 Dec 2022 17:00:09 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883761</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>Qraizer</strong>, что-то у тя какая-то жуть  :-? <br>
Я попробовал твой пример прогнать в <a class='tag-url' href='https://onlinegdb.com/Ve4txC8Im' target='_blank'>https://www.onlinegdb.com</a>, выбрал там стандарт С++20, чет он заругался на твой код в отдельных местах. Ну не суть, я подредактировал.<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">#include &#60;chrono&#62;</div><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;thread&#62;</div><div class="code_line">#include &#60;utility&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">/* динамически полиморфная иерархия */</div><div class="code_line">struct DynaPolyBase &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // интерфейс</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;virtual void doIt() const = 0;</div><div class="code_line">};</div><div class="code_line">// реализации</div><div class="code_line">struct DynaPolyDerived1 : DynaPolyBase</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;void doIt() const override {};</div><div class="code_line">};</div><div class="code_line">struct DynaPolyDerived2 : DynaPolyBase</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;void doIt() const override {};</div><div class="code_line">};</div><div class="code_line">struct DynaPolyDerived3 : DynaPolyDerived1</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;void doIt() const override {};</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">/* статически полиморфная иерархия */</div><div class="code_line">// реализации</div><div class="code_line">struct StatPolyDerived1</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;void doIt() const {};</div><div class="code_line">};</div><div class="code_line">struct StatPolyDerived2</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;void doIt() const {};</div><div class="code_line">};</div><div class="code_line">struct StatPolyDerived3</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;void doIt() const {};</div><div class="code_line">};</div><div class="code_line">template &#60;typename Class&#62; &nbsp; &nbsp; &nbsp; // интерфейс</div><div class="code_line">struct StatPolyBase : Class</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">template &#60;typename C, auto Count = 1000u * 1000 * 1000&#62;</div><div class="code_line">void doIt(const C&amp; c)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;for (auto i = 0; i &#60; Count; ++i) c.doIt();</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;</div><div class="code_line">&nbsp;&nbsp;StatPolyBase&#60;StatPolyDerived2&#62; item1;</div><div class="code_line">&nbsp;&nbsp;DynaPolyDerived2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;auto start = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;doIt(item1); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// чек статики</div><div class="code_line">&nbsp;&nbsp;auto diff &nbsp;= std::chrono::high_resolution_clock::now() - start;</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; diff.count() &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;start = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;doIt(item2); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// чек динамики</div><div class="code_line">&nbsp;&nbsp;diff &nbsp;= std::chrono::high_resolution_clock::now() - start;</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; diff.count() &#60;&#60; std::endl;</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">2908372641</div><div class="code_line">2742338534</div></ol></div></div></div></div><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">1867473111</div><div class="code_line">2083640450</div></ol></div></div></div></div><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">1968410219</div><div class="code_line">2046030004</div></ol></div></div></div></div><br>
А в твоем примере вообще какая-то лютая разница :-?]]></description>
        <author>Majestio</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883756</guid>
        <pubDate>Fri, 23 Dec 2022 14:41:48 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883756</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">#include &#60;chrono&#62;</div><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;thread&#62;</div><div class="code_line">#include &#60;utility&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">/* динамически полиморфная иерархия */</div><div class="code_line">struct DynaPolyBase &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // интерфейс</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;virtual void doIt() const = 0;</div><div class="code_line">};</div><div class="code_line">// реализации</div><div class="code_line">struct DynaPolyDerived1 : DynaPolyBase</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;virtual void doIt() const {};</div><div class="code_line">};</div><div class="code_line">struct DynaPolyDerived2 : DynaPolyBase</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;virtual void doIt() const {};</div><div class="code_line">};</div><div class="code_line">struct DynaPolyDerived3 : DynaPolyDerived1</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;virtual void doIt() const {};</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">/* статически полиморфная иерархия */</div><div class="code_line">// реализации</div><div class="code_line">struct StatPolyDerived1</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;void doIt() const {};</div><div class="code_line">};</div><div class="code_line">struct StatPolyDerived2</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;void doIt() const {};</div><div class="code_line">};</div><div class="code_line">struct StatPolyDerived3</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;void doIt() const {};</div><div class="code_line">};</div><div class="code_line">template &#60;typename Class&#62; requires ( requires { std::declval&#60;Class&#62;().doIt(); } ) &nbsp; &nbsp; &nbsp; // интерфейс</div><div class="code_line">struct StatPolyBase : Class</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">template &#60;typename C, auto Count = 1000u * 1000 * 1000&#62;</div><div class="code_line">void doIt(const C&amp; c)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;for (decltype(Count) i = 0; i &#60; Count; ++i) c.doIt();</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;auto start = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;StatPolyBase&#60;StatPolyDerived2&#62; item1;</div><div class="code_line">&nbsp;&nbsp;DynaPolyDerived2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;doIt(item1); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// чек статики</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;auto diff &nbsp;= std::chrono::high_resolution_clock::now() - start;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; diff &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp;start = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp;doIt(item2); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// чек динамики</div><div class="code_line">&nbsp;&nbsp;diff &nbsp;= std::chrono::high_resolution_clock::now() - start;</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; diff &#60;&#60; std::endl;</div><div class="code_line">}</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">200ns</div><div class="code_line">610564600ns</div></ol></div></div></div></div>]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883728</guid>
        <pubDate>Fri, 23 Dec 2022 11:00:27 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883728</link>
        <description><![CDATA[jack128: Для вызова метода интерфейса ж нужно сначала извлечь адрес метода из VMT и только потом сделать call, но тут разница микроскопическая. А вот что реально важно, так это inline. Если у нас в коде есть только интерфейс, то компилятор(JIT в случае .NET) не в курсе, что именно за метод должен вызваться и честно делает call &lt;адрес метода&gt; , вот если у нас есть структура мы вызваем myStruct.MyMethod(args) то jit сможет заинлайнить MyMethod со всеми вытекающими. <br><br>В .NET классический пример всего этого - это generic math в .NET 6 и ниже. Только после .NET7 таких примеров хрен нагуглишь :-D . А самому писать лень, сорри.]]></description>
        <author>jack128</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883641</guid>
        <pubDate>Wed, 21 Dec 2022 19:25:45 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883641</link>
        <description><![CDATA[IL_Agent: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3883566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>jack128 &#064; <time class="tag-quote__quoted-time" datetime="2022-12-20T20:28:33+00:00">20.12.22, 20:28</time></span><div class='quote '>Вот как раз в этом случае у тебя будут потери на косвенный вызов метода через интерфейсную ссылку.</div></div><br>
Хочешь сказать, что вызов метода конкретного класса быстрее, чем вызов того же метода, но через интерфейс? Есть пруфы?]]></description>
        <author>IL_Agent</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883566</guid>
        <pubDate>Tue, 20 Dec 2022 20:28:33 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883566</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3883476'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>IL_Agent &#064; <time class="tag-quote__quoted-time" datetime="2022-12-19T20:49:22+00:00">19.12.22, 20:49</time></span><div class='quote '>Достаточно передать в конструктор класса Foo нужный экземпляр ISync.</div></div><br>
<br>
Вот как раз в этом случае у тебя будут потери на косвенный вызов метода через интерфейсную ссылку. Если это не парит, то и прекрасно. А во в случаях когда каждая микросекунда важна - дженерики - наше всё (в .NET)]]></description>
        <author>jack128</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883476</guid>
        <pubDate>Mon, 19 Dec 2022 20:49:22 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3883476</link>
        <description><![CDATA[IL_Agent: Привет)<br>Справедливости ради, пример на C# был написан так, чтобы внешне быть похожим на плюсовый. На самом деле практической ценности в нём нет, так писать не стоит, дженерики тут не нужны. Достаточно передать в конструктор класса Foo нужный экземпляр ISync.<br>И да, что-то &quot;собрать&quot; при компиляции можно с помощью кодогенерации (Roslyn, annotation processing, KSP и т.д), но тут это из пушки по воробьям)]]></description>
        <author>IL_Agent</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882375</guid>
        <pubDate>Wed, 30 Nov 2022 19:36:53 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882375</link>
        <description><![CDATA[jack128: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882152'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T12:33:37+00:00">28.11.22, 12:33</time></span><div class='quote '>Тут вся фишка в С++ в том, что политиками ты статически как бы &quot;собираешь&quot; свой тип, но при этом ты ничем не жертвуешь в динамкие. Т.е. как будто ты сам писал все эти классы руками делал.<br>
Т.е. абстракция остается исключительно в коде, а не в итоговой программе. Не думаю, что в других языках такое есть.</div></div><br>
<br>
В C# варианте, если IPolicy будут реализовывать структуры, а не классы, как в примере, то в ран тайм тоже не будет накладных расходов.]]></description>
        <author>jack128</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882331</guid>
        <pubDate>Wed, 30 Nov 2022 16:17:51 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882331</link>
        <description><![CDATA[Qraizer: Угу. ;)]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882297</guid>
        <pubDate>Wed, 30 Nov 2022 13:10:25 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882297</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882292'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-11-30T12:34:23+00:00">30.11.22, 12:34</time></span><div class='quote '>Это не обычная перегрузка. Это перегрузка с целью запрета генерировать эти спец.методы компилятором. Цель в том, чтобы запретить копирования и присваивания. Если их просто никак не объявить, компилятор способен будет сгенерировать их сам, если же они объявлены, то генерировать он уже ничего не будет. Но т.к. я их не определил, то при попытке скопировать или присвоить будет ошибка линковки. Т.е. цель запрета на эти операции достигнута, путь и несколько странным способом. Т.к. я не планирую их использовать, то и прототип может быть любым, Стандарт не запрещает возвращать что ни попадя. Конечно, для обычной перегрузки так писать не стоит, кроме очень специфичных случаев.<br>
В новых Стандартах для такого запрета есть более правильные методы, но на момент написания того кода их ещё не было, или поддерживающие новые фишки Стандарта компиляторы мне не были доступны.</div></div><br>
 :good:<br>
<br>
Что-то типа <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">X&amp; operator=(const X&amp;) = delete;</span></span> ?]]></description>
        <author>Majestio</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882292</guid>
        <pubDate>Wed, 30 Nov 2022 12:34:23 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882292</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882214'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2022-11-29T04:43:41+00:00">29.11.22, 04:43</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882134'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T11:06:25+00:00">28.11.22, 11:06</time></span><div class='quote '>void operator=(const CT_Sync&amp;);</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882134'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T11:06:25+00:00">28.11.22, 11:06</time></span><div class='quote '>void operator=(const Mutex_Sync&amp;);</div></div><br>
А что, так можно перегружать?<br>
<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">Type&amp; operator=(const Type&amp; t);</div></ol></div></div></div></div></div></div><br>
Это не обычная перегрузка. Это перегрузка с целью запрета генерировать эти спец.методы компилятором. Цель в том, чтобы запретить копирования и присваивания. Если их просто никак не объявить, компилятор способен будет сгенерировать их сам, если же они объявлены, то генерировать он уже ничего не будет. Но т.к. я их не определил, то при попытке скопировать или присвоить будет ошибка линковки. Т.е. цель запрета на эти операции достигнута, пусть и несколько странным способом. Т.к. я не планирую их использовать, то и прототип может быть любым, Стандарт не запрещает возвращать что ни попадя. Конечно, для обычной перегрузки так писать не стоит, кроме очень специфичных случаев.<br>
В новых Стандартах для такого запрета есть более правильные методы, но на момент написания того кода их ещё не было, или поддерживающие новые фишки Стандарта компиляторы мне не были доступны.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882228</guid>
        <pubDate>Tue, 29 Nov 2022 08:50:48 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882228</link>
        <description><![CDATA[OpenGL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882221'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2022-11-29T07:25:43+00:00">29.11.22, 07:25</time></span><div class='quote '><br>
В оригинальном примере в Foo не было поля p =/</div></div><br>
Это да. Но с другой стороны - чем оно мешает? На sizeof класса это не влияет, так что аналог empty base optimization (или как оно там в плюсах зовётся) тут применяется]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882221</guid>
        <pubDate>Tue, 29 Nov 2022 07:25:43 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882221</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882215'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>OpenGL &#064; <time class="tag-quote__quoted-time" datetime="2022-11-29T05:15:55+00:00">29.11.22, 05:15</time></span><div class='quote '><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 Foo&#60;P: Policy&#62; {</div><div class="code_line">    p: P,</div><div class="code_line">}</div></ol></div></div></div></div></div></div><br>
В оригинальном примере в Foo не было поля p =/<br>
С полем-то каждый может  :D]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882220</guid>
        <pubDate>Tue, 29 Nov 2022 07:21:53 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882220</link>
        <description><![CDATA[korvin: Можно так:<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">module Region :</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;type region</div><div class="code_line">&nbsp;&nbsp; &nbsp;val ( #: ) &nbsp; : region -&#62; (&#39;a -&#62; unit) -&#62; &#39;a -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val ( let&amp; ) : (region -&#62; &#39;a) -&#62; (&#39;a -&#62; &#39;b) -&#62; &#39;b</div><div class="code_line">&nbsp;&nbsp;end =</div><div class="code_line">struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type finalizer = unit -&#62; unit</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type region = finalizer list ref</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let make () = ref []</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let ( #: ) r f v =</div><div class="code_line">&nbsp;&nbsp; &nbsp;r := (fun () -&#62; f v) :: !r</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let rec exit r =</div><div class="code_line">&nbsp;&nbsp; &nbsp;match !r with</div><div class="code_line">&nbsp;&nbsp; &nbsp;| [] &nbsp; &nbsp;-&#62; ()</div><div class="code_line">&nbsp;&nbsp; &nbsp;| f::fs -&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;f () ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;r := fs ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit r</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let ( let&amp; ) : (region -&#62; &#39;a) -&#62; (&#39;a -&#62; &#39;b) -&#62; &#39;b</div><div class="code_line">&nbsp;&nbsp; &nbsp;= fun constr proc -&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;let region = make () in</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Fun.protect</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;~finally:(fun () -&#62; exit region)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin fun () -&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let res = constr region in</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proc res</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">open Region</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module File :</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;type t</div><div class="code_line">&nbsp;&nbsp; &nbsp;val open_rw &nbsp; &nbsp;: string -&#62; region -&#62; t</div><div class="code_line">&nbsp;&nbsp; &nbsp;val read_line &nbsp;: t -&#62; string option</div><div class="code_line">&nbsp;&nbsp; &nbsp;val write_line : t -&#62; string -&#62; unit</div><div class="code_line">&nbsp;&nbsp;end =</div><div class="code_line">struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type t =</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; path : string</div><div class="code_line">&nbsp;&nbsp; &nbsp;; mutable data : string list }</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let rec open_rw path region =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;++++ OPEN %s\n&quot; path ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;let f = { path ; data = [&quot;foo&quot;;&quot;bar&quot;;&quot;gee&quot;;&quot;qux&quot;] } in</div><div class="code_line">&nbsp;&nbsp; &nbsp;region #: close f ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;f</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;and close f =</div><div class="code_line">&nbsp;&nbsp; &nbsp;f.data &#60;- [] ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;---- CLOSE %s\n&quot; f.path</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let read_line f =</div><div class="code_line">&nbsp;&nbsp; &nbsp;match f.data with</div><div class="code_line">&nbsp;&nbsp; &nbsp;| [] -&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Printf.printf &quot;EOF\n&quot; ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;None</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp;| line::rest -&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;f.data &#60;- rest ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Printf.printf &quot;READ %s FROM %s\n&quot; line f.path ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Some line</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let write_line f line =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;WRITE %s TO %s\n&quot; line f.path ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;f.data &#60;- List.append f.data [line]</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module SQL_DB :</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;type t</div><div class="code_line">&nbsp;&nbsp; &nbsp;val connect : string -&#62; region -&#62; t</div><div class="code_line">&nbsp;&nbsp; &nbsp;val select &nbsp;: t -&#62; string list</div><div class="code_line">&nbsp;&nbsp; &nbsp;val insert &nbsp;: t -&#62; string -&#62; unit</div><div class="code_line">&nbsp;&nbsp;end =</div><div class="code_line">struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type t =</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; table : string</div><div class="code_line">&nbsp;&nbsp; &nbsp;; mutable rows &nbsp;: string list }</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let rec connect table region =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;++++ CONNECT TO %s\n&quot; table ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;let c = { table ; rows = [&quot;foo&quot;;&quot;bar&quot;] } in</div><div class="code_line">&nbsp;&nbsp; &nbsp;region #: disconnect c ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;c</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;and disconnect conn =</div><div class="code_line">&nbsp;&nbsp; &nbsp;conn.rows &#60;- [] ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;---- DISCONNECT FROM %s\n&quot; conn.table</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let select conn =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;SELECT * FROM %s\n&quot; conn.table ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;conn.rows</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let insert conn value =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;INSERT INTO %s VALUE \&quot;%s\&quot;\n&quot; conn.table value ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;conn.rows &#60;- value :: conn.rows</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module Transfer :</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;type t</div><div class="code_line">&nbsp;&nbsp; &nbsp;val make &nbsp; &nbsp; : db:string -&#62; file:string -&#62; region -&#62; t</div><div class="code_line">&nbsp;&nbsp; &nbsp;val upload &nbsp; : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val download : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp;end =</div><div class="code_line">struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type t =</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ db : SQL_DB.t</div><div class="code_line">&nbsp;&nbsp; &nbsp;; fd : File.t }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let make ~db:conn_str ~file:path region =</div><div class="code_line">&nbsp;&nbsp; &nbsp;let db = SQL_DB.connect conn_str region in</div><div class="code_line">&nbsp;&nbsp; &nbsp;let fd = File.open_rw path region in</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ db : SQL_DB.t</div><div class="code_line">&nbsp;&nbsp; &nbsp;; fd : File.t }</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let upload { db ; fd } =</div><div class="code_line">&nbsp;&nbsp; &nbsp;let rec loop () =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;match File.read_line fd with</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;| None -&#62; ()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;| Some line -&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SQL_DB.insert db line ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loop ()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp;in loop ()</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let download { db ; fd } =</div><div class="code_line">&nbsp;&nbsp; &nbsp;let lines = SQL_DB.select db in</div><div class="code_line">&nbsp;&nbsp; &nbsp;List.iter (File.write_line fd) lines</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">let _ =</div><div class="code_line">&nbsp;&nbsp;( let&amp; users = Transfer.make ~db:&quot;users&quot; ~file:&quot;/tmp/users&quot; in</div><div class="code_line">&nbsp;&nbsp; &nbsp;Transfer.upload &nbsp; users ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Transfer.download users );</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;print_endline &quot;--------------------------------&quot; ;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;( let&amp; posts = Transfer.make ~db:&quot;posts&quot; ~file:&quot;/tmp/posts&quot; in</div><div class="code_line">&nbsp;&nbsp; &nbsp;Transfer.download posts ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Transfer.upload &nbsp; posts );</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;print_endline &quot;--------------------------------&quot; ;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;( let&amp; users = Transfer.make ~db:&quot;users&quot; ~file:&quot;/tmp/users&quot; in</div><div class="code_line">&nbsp;&nbsp; &nbsp;let&amp; posts = Transfer.make ~db:&quot;posts&quot; ~file:&quot;/tmp/posts&quot; in</div><div class="code_line">&nbsp;&nbsp; &nbsp;Transfer.download users ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Transfer.download posts )</div></ol></div></div></div></div><br>
— <a class='tag-url' href='https://godbolt.org/z/eb8e44av5' target='_blank'>https://godbolt.org/z/eb8e44av5</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">++++ CONNECT TO users</div><div class="code_line">++++ OPEN /tmp/users</div><div class="code_line">READ foo FROM /tmp/users</div><div class="code_line">INSERT INTO users VALUE &quot;foo&quot;</div><div class="code_line">READ bar FROM /tmp/users</div><div class="code_line">INSERT INTO users VALUE &quot;bar&quot;</div><div class="code_line">READ gee FROM /tmp/users</div><div class="code_line">INSERT INTO users VALUE &quot;gee&quot;</div><div class="code_line">READ qux FROM /tmp/users</div><div class="code_line">INSERT INTO users VALUE &quot;qux&quot;</div><div class="code_line">EOF</div><div class="code_line">SELECT * FROM users</div><div class="code_line">WRITE qux TO /tmp/users</div><div class="code_line">WRITE gee TO /tmp/users</div><div class="code_line">WRITE bar TO /tmp/users</div><div class="code_line">WRITE foo TO /tmp/users</div><div class="code_line">WRITE foo TO /tmp/users</div><div class="code_line">WRITE bar TO /tmp/users</div><div class="code_line">---- CLOSE /tmp/users</div><div class="code_line">---- DISCONNECT FROM users</div><div class="code_line">--------------------------------</div><div class="code_line">++++ CONNECT TO posts</div><div class="code_line">++++ OPEN /tmp/posts</div><div class="code_line">SELECT * FROM posts</div><div class="code_line">WRITE foo TO /tmp/posts</div><div class="code_line">WRITE bar TO /tmp/posts</div><div class="code_line">READ foo FROM /tmp/posts</div><div class="code_line">INSERT INTO posts VALUE &quot;foo&quot;</div><div class="code_line">READ bar FROM /tmp/posts</div><div class="code_line">INSERT INTO posts VALUE &quot;bar&quot;</div><div class="code_line">READ gee FROM /tmp/posts</div><div class="code_line">INSERT INTO posts VALUE &quot;gee&quot;</div><div class="code_line">READ qux FROM /tmp/posts</div><div class="code_line">INSERT INTO posts VALUE &quot;qux&quot;</div><div class="code_line">READ foo FROM /tmp/posts</div><div class="code_line">INSERT INTO posts VALUE &quot;foo&quot;</div><div class="code_line">READ bar FROM /tmp/posts</div><div class="code_line">INSERT INTO posts VALUE &quot;bar&quot;</div><div class="code_line">EOF</div><div class="code_line">---- CLOSE /tmp/posts</div><div class="code_line">---- DISCONNECT FROM posts</div><div class="code_line">--------------------------------</div><div class="code_line">++++ CONNECT TO users</div><div class="code_line">++++ OPEN /tmp/users</div><div class="code_line">++++ CONNECT TO posts</div><div class="code_line">++++ OPEN /tmp/posts</div><div class="code_line">SELECT * FROM users</div><div class="code_line">WRITE foo TO /tmp/users</div><div class="code_line">WRITE bar TO /tmp/users</div><div class="code_line">SELECT * FROM posts</div><div class="code_line">WRITE foo TO /tmp/posts</div><div class="code_line">WRITE bar TO /tmp/posts</div><div class="code_line">---- CLOSE /tmp/posts</div><div class="code_line">---- DISCONNECT FROM posts</div><div class="code_line">---- CLOSE /tmp/users</div><div class="code_line">---- DISCONNECT FROM users</div></ol></div></div></div></div>]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882216</guid>
        <pubDate>Tue, 29 Nov 2022 06:07:40 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882216</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882211'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T23:10:50+00:00">28.11.22, 23:10</time></span><div class='quote '>Да, с плюсами разница как раз в том, что только в функции это работает. В С++ же это так же будет работать и для полей и автоматически вызываться при разрушении объекта.</div></div><br>
Спасибо, Кэп ))]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882215</guid>
        <pubDate>Tue, 29 Nov 2022 05:15:55 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882215</link>
        <description><![CDATA[OpenGL: Раст. <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">trait Policy {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn new() -&#62; Self;</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn lock(&amp;mut self);</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn unlock(&amp;mut self);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">struct LockGuard&#60;&#39;a, P: Policy&#62; {</div><div class="code_line">&nbsp;&nbsp; &nbsp;p: &amp;&#39;a mut P,</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">impl&#60;&#39;a, P: Policy&#62; LockGuard&#60;&#39;a, P&#62; {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn new(p: &amp;&#39;a mut P) -&#62; Self {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;p.lock();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Self { p }</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">impl&#60;&#39;a, P: Policy&#62; Drop for LockGuard&#60;&#39;a, P&#62; {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn drop(&amp;mut self) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;self.p.unlock();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">struct Foo&#60;P: Policy&#62; {</div><div class="code_line">&nbsp;&nbsp; &nbsp;p: P,</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">impl&#60;P: Policy&#62; Foo&#60;P&#62; {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn new() -&#62; Foo&#60;P&#62; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Foo { p: Policy::new() }</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn do_smth(&amp;mut self) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;let lock = LockGuard::new(&amp;mut self.p);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Do something</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;println!(&quot;Hello!&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">struct NoLock {}</div><div class="code_line">&nbsp;</div><div class="code_line">impl Policy for NoLock {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn new() -&#62; Self {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Self {}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn lock(&amp;mut self) {}</div><div class="code_line">&nbsp;&nbsp; &nbsp;fn unlock(&amp;mut self) {}</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="2022-11-29T05:18:36+00:00">29.11.22, 05:18</time></span></span><br>
Из удобного - спева написал версию с ручным lock-unlock, потом добавил LockGuard, заменил вызов lock на создание объекта LockGuard и компилятор сразу выдал ошибку - дескать, unlock руками вызывать не можешь, т.к. объект отдали. BC всё-таки удобная вещь :)]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882214</guid>
        <pubDate>Tue, 29 Nov 2022 04:43:41 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882214</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882134'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T11:06:25+00:00">28.11.22, 11:06</time></span><div class='quote '>void operator=(const CT_Sync&amp;);</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882134'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T11:06:25+00:00">28.11.22, 11:06</time></span><div class='quote '>void operator=(const Mutex_Sync&amp;);</div></div><br>
А что, так можно перегружать?<br>
<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">Type&amp; operator=(const Type&amp; t);</div></ol></div></div></div></div>]]></description>
        <author>Majestio</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882211</guid>
        <pubDate>Mon, 28 Nov 2022 23:10:50 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882211</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882181'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T16:45:44+00:00">28.11.22, 16:45</time></span><div class='quote '>Хм. Формально ничто не запрещает на функторах переписать... <strong class='tag-b'>D_KEY</strong>, как думаешь, стоит ли?</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="2022-11-28T23:13:06+00:00">28.11.22, 23:13</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882185'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T17:14:56+00:00">28.11.22, 17:14</time></span><div class='quote '>В Ocaml можно вот так сделать, но это только в теле функции, аналог try-with-resources в Java и прочих</div></div><br>
Да, с плюсами разница как раз в том, что только в функции это работает. В С++ же это так же будет работать и для полей и автоматически вызываться при разрушении объекта.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882188</guid>
        <pubDate>Mon, 28 Nov 2022 18:06:10 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882188</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882181'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T16:45:44+00:00">28.11.22, 16:45</time></span><div class='quote '>Формально ничто не запрещает на функторах переписать...</div></div><br>
В Ocaml под функторами <a class='tag-url' href='https://dev.realworldocaml.org/functors.html' target='_blank'>немного другое</a> подразумевается. Но я не отговариваю )]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882185</guid>
        <pubDate>Mon, 28 Nov 2022 17:14:56 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882185</link>
        <description><![CDATA[korvin: В Ocaml можно вот так сделать, но это только в теле функции, аналог try-with-resources в Java и прочих:<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">type &#39;a resource =</div><div class="code_line">&nbsp;&nbsp;{ acquire : unit -&#62; &#39;a</div><div class="code_line">&nbsp;&nbsp;; release : &#39;a -&#62; unit }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">let ( let&amp; ) : &#39;a resource -&#62; (&#39;a -&#62; &#39;b) -&#62; &#39;b</div><div class="code_line">&nbsp;&nbsp;= fun r f -&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;let h = r.acquire () in</div><div class="code_line">&nbsp;&nbsp; &nbsp;Fun.protect ~finally:(fun () -&#62; r.release h) begin fun () -&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;f h</div><div class="code_line">&nbsp;&nbsp; &nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module type MT_policy =</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;val lock &nbsp; : unit -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val unlock : unit -&#62; unit</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module Foo (Policy : MT_policy) = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let lock () =</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ acquire = Policy.lock</div><div class="code_line">&nbsp;&nbsp; &nbsp;; release = Policy.unlock }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let do_something () =</div><div class="code_line">&nbsp;&nbsp; &nbsp;let&amp; _ = lock () in</div><div class="code_line">&nbsp;&nbsp; &nbsp;print_endline &quot;Doing something...&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">end</div></ol></div></div></div></div>]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882183</guid>
        <pubDate>Mon, 28 Nov 2022 16:56:03 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882183</link>
        <description><![CDATA[Qraizer: В целом да, это второстепенное. Но с точки зрения отказоустойчивости кода – ни разу не второстепенное. Надёжность моего кода не должна зависеть от надёжности чьего-то ещё. Без RAII можно заморочиться чеком всевозможных нюансов между lock() и unlock() внутри DoSomething(), и если заморочился и не набажил, то возьми с полки пирожок. Кто как, я вот предпочитаю пирожок в руках сразу, а не тянуться за ним до полки.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882182</guid>
        <pubDate>Mon, 28 Nov 2022 16:46:59 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882182</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882179'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T16:45:08+00:00">28.11.22, 16:45</time></span><div class='quote '>но не блокировки на нём.</div></div><br>
А, понял. Я про lock/unlock в doSomething и не думал, как-то второстепенным уже казалось ))]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882181</guid>
        <pubDate>Mon, 28 Nov 2022 16:45:44 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882181</link>
        <description><![CDATA[Qraizer: Хм. Формально ничто не запрещает на функторах переписать... <strong class='tag-b'>D_KEY</strong>, как думаешь, стоит ли?]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882180</guid>
        <pubDate>Mon, 28 Nov 2022 16:45:22 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882180</link>
        <description><![CDATA[korvin: Я тем временем сделал альтернативную Ocaml-версию, без объектов, чисто на функторах, и заодно немного по-другому сделал финализацию:<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">module type MT_policy =</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;val lock &nbsp; : unit -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val unlock : unit -&#62; unit</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module Foo (Policy : MT_policy) = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let do_something () =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Policy.lock () ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;print_endline &quot;Doing something...&quot; ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Policy.unlock ()</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">(* -------- EXT LIB -------- *)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module CRITICAL_SECTION :</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;type t</div><div class="code_line">&nbsp;&nbsp; &nbsp;val value &nbsp; &nbsp; &nbsp;: unit -&#62; t</div><div class="code_line">&nbsp;&nbsp; &nbsp;val initialize : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val enter &nbsp; &nbsp; &nbsp;: t -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val leave &nbsp; &nbsp; &nbsp;: t -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val delete &nbsp; &nbsp; : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp;end =</div><div class="code_line">struct</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;type t = int ref</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let value () = ref 0</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let initialize sec =</div><div class="code_line">&nbsp;&nbsp; &nbsp;let sid = Random.int 100 in</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;---- INIT SEC %d\n&quot; sid ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sec := sid</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let enter sec =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;ENTER SEC %d\n&quot; !sec</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let leave sec =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;LEAVE SEC %d\n&quot; !sec</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let delete sec =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;---- DEL SEC %d\n&quot; !sec ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sec := 0</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module Mutex :</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;type t</div><div class="code_line">&nbsp;&nbsp; &nbsp;val construct : unit -&#62; t</div><div class="code_line">&nbsp;&nbsp; &nbsp;val acquire &nbsp; : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val release &nbsp; : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val destruct &nbsp;: t -&#62; unit</div><div class="code_line">&nbsp;&nbsp;end =</div><div class="code_line">struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type t = int ref</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let construct () =</div><div class="code_line">&nbsp;&nbsp; &nbsp;let mid = 100 + Random.int 100 in</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;---- CONSTR MUX %d\n&quot; mid ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ref mid</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let acquire mux =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;ACQ MUX %d\n&quot; !mux</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let release mux =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;REL MUX %d\n&quot; !mux</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let destruct mux =</div><div class="code_line">&nbsp;&nbsp; &nbsp;Printf.printf &quot;---- DESTR MUX %d\n&quot; !mux ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mux := 0</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">(* -------------------------------- *)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module No_sync : MT_policy = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let lock &nbsp; &nbsp; () = ()</div><div class="code_line">&nbsp;&nbsp;let unlock &nbsp; () = ()</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module type REGION =</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;val finalize : (&#39;a -&#62; unit) -&#62; &#39;a -&#62; unit</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module CT_sync (R : REGION) : MT_policy = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let ct = CRITICAL_SECTION.value ()</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let _ = CRITICAL_SECTION.initialize ct</div><div class="code_line">&nbsp;&nbsp;let _ = R.finalize CRITICAL_SECTION.delete ct</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let lock &nbsp; () = CRITICAL_SECTION.enter ct</div><div class="code_line">&nbsp;&nbsp;let unlock () = CRITICAL_SECTION.leave ct</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module MX_sync (R : REGION) : MT_policy = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let mx = Mutex.construct ()</div><div class="code_line">&nbsp;&nbsp;let _ &nbsp;= R.finalize Mutex.destruct mx</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let lock &nbsp; () = Mutex.acquire mx</div><div class="code_line">&nbsp;&nbsp;let unlock () = Mutex.release mx</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">(* -------------------------------- *)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module Region () :</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;val finalize : (&#39;a -&#62; unit) -&#62; &#39;a -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val exit &nbsp; &nbsp; : unit -&#62; unit</div><div class="code_line">&nbsp;&nbsp;end =</div><div class="code_line">struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let finalizers = ref []</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let finalize f v =</div><div class="code_line">&nbsp;&nbsp; &nbsp;finalizers := (fun () -&#62; f v) :: !finalizers</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let rec exit () =</div><div class="code_line">&nbsp;&nbsp; &nbsp;match !finalizers with</div><div class="code_line">&nbsp;&nbsp; &nbsp;| [] &nbsp; &nbsp;-&#62; ()</div><div class="code_line">&nbsp;&nbsp; &nbsp;| f::fs -&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;f () ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;finalizers := fs ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit ()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">let _ =</div><div class="code_line">&nbsp;&nbsp;Random.self_init () ;</div><div class="code_line">&nbsp;&nbsp;let module REGION = Region () in</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;let module F1 = Foo (CT_sync (REGION)) in</div><div class="code_line">&nbsp;&nbsp;let module F2 = Foo (MX_sync (REGION)) in</div><div class="code_line">&nbsp;&nbsp;let module F3 = Foo (No_sync) in</div><div class="code_line">&nbsp;&nbsp;let module F4 = Foo (CT_sync (REGION)) in</div><div class="code_line">&nbsp;&nbsp;let module F5 = Foo (MX_sync (REGION)) in</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;F1.do_something () ;</div><div class="code_line">&nbsp;&nbsp;F2.do_something () ;</div><div class="code_line">&nbsp;&nbsp;F3.do_something () ;</div><div class="code_line">&nbsp;&nbsp;F4.do_something () ;</div><div class="code_line">&nbsp;&nbsp;F5.do_something () ;</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;REGION.exit ()</div></ol></div></div></div></div><br>
=&gt;<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">---- INIT SEC 35</div><div class="code_line">---- CONSTR MUX 181</div><div class="code_line">---- INIT SEC 0</div><div class="code_line">---- CONSTR MUX 168</div><div class="code_line">ENTER SEC 35</div><div class="code_line">Doing something...</div><div class="code_line">LEAVE SEC 35</div><div class="code_line">ACQ MUX 181</div><div class="code_line">Doing something...</div><div class="code_line">REL MUX 181</div><div class="code_line">Doing something...</div><div class="code_line">ENTER SEC 0</div><div class="code_line">Doing something...</div><div class="code_line">LEAVE SEC 0</div><div class="code_line">ACQ MUX 168</div><div class="code_line">Doing something...</div><div class="code_line">REL MUX 168</div><div class="code_line">---- DESTR MUX 168</div><div class="code_line">---- DEL SEC 0</div><div class="code_line">---- DESTR MUX 181</div><div class="code_line">---- DEL SEC 35</div></ol></div></div></div></div><br>
<br>
— <a class='tag-url' href='https://godbolt.org/z/K4b6xGG15' target='_blank'>https://godbolt.org/z/K4b6xGG15</a>]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882179</guid>
        <pubDate>Mon, 28 Nov 2022 16:45:08 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882179</link>
        <description><![CDATA[Qraizer: Это если мы за собственно объект. А как быть с блокировкой на нём? Нужно обеспечить корректное освобождение даже при исключениях, что и делает RAII. В исходном коде RAII существовала для объекта синхронизации, но не блокировки на нём.<br>Хотя, это зависит от того, что ты понимаешь под финализацией, конечно.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882178</guid>
        <pubDate>Mon, 28 Nov 2022 16:42:27 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882178</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882155'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T12:44:34+00:00">28.11.22, 12:44</time></span><div class='quote '>Откровенно говоря, в моём примере тоже нет финализации</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">public:</div><div class="code_line">&nbsp;&nbsp;CT_Sync() &nbsp; { InitializeCriticalSection(&amp;ct); }</div><div class="code_line">&nbsp;~CT_Sync() &nbsp; { DeleteCriticalSection &nbsp; &nbsp;(&amp;ct); }</div></ol></div></div></div></div>]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882177</guid>
        <pubDate>Mon, 28 Nov 2022 16:38:20 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882177</link>
        <description><![CDATA[Qraizer: Блин. Ты не понял. Ну давай за стратегию безопасности кастов целых тогда. Вот я хочу чекать переполнения или не хочу. Или за стратегию транспорта для сетевого протокола. Элементарно TCP vs UDP. У тебя есть что-то в std для этого?<br>Ещё раз. В общем случае нужно рассчитывать, что стратегии придётся писать фуллстэк. На всех уровнях, распространяя их сверху донизу иерархии или наоборот. И шаблоны на это способны. Тут да, можно применить std::, я просто не стал менять коней на полпути.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882172</guid>
        <pubDate>Mon, 28 Nov 2022 15:42:01 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882172</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882169'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T15:26:32+00:00">28.11.22, 15:26</time></span><div class='quote '>Тогда и CT_Sync с Mutex_Sync не нужны, ведь есть std::mutex и std::recursive_mutex.</div></div><br>
Ну мы же о стратегиях говорим. Можем написать разные классы, в том числе и для отсутствия блокировок. При этом std::lock_guard будет применим :-?]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882169</guid>
        <pubDate>Mon, 28 Nov 2022 15:26:32 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882169</link>
        <description><![CDATA[Qraizer: Тогда и CT_Sync с Mutex_Sync не нужны, ведь есть std::mutex и std::recursive_mutex. Вопрос в той теме стоял несколько по-другому: продемонстрировать возможности шаблонов в части устранения ненужного динамического оверхеда интерфейсов в случае статики. Я не стал менять коней, ибо не для всякой ситуации в std есть готовые патерны. <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-11-28T15:28:05+00:00">28.11.22, 15:28</time></span></span><br>
P.S. Ну и чтобы совсем хорошо, следует избавиться от наследования в пользу объекта-агрегата. Наследование там не требуется, а агрегат можно сделать mutable и т.с. позволить работать в константных методах.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882156</guid>
        <pubDate>Mon, 28 Nov 2022 12:58:22 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882156</link>
        <description><![CDATA[D_KEY: <strong class='tag-b'>Qraizer</strong>, зачем там свой Guard? Достаточно удовлетворять BasicLockable и можно юзать std::lock_guard.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882155</guid>
        <pubDate>Mon, 28 Nov 2022 12:44:34 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882155</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">template &#60;typename MT_Policy&#62;</div><div class="code_line">class Guard</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;MT_Policy&amp; synk;</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;explicit Guard(MT_Policy&amp; obj): synk(obj) { synk.lock(); }</div><div class="code_line">&nbsp;&nbsp;~Guard() { synk.unlock(); }</div><div class="code_line">};</div></ol></div></div></div></div><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 MT_Policy&#62;</div><div class="code_line">class Foo: public MT_Policy</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;/* ... */</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;/* ... */</div><div class="code_line">&nbsp;&nbsp;void DoSomething()</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Guard&#60;MT_Policy&#62; guardian(*this);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* do something */</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">};</div></ol></div></div></div></div><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">void DoSomething()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;/* do something */</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Guard&#60;MT_Policy&#62; guardian(*this);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* do something more */</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;/* continue something doing*/</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882152</guid>
        <pubDate>Mon, 28 Nov 2022 12:33:37 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882152</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882134'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T11:06:25+00:00">28.11.22, 11:06</time></span><div class='quote '>В оригинальном примере они вызываются через this-&gt;, в Java можно вызывать статические функции через this. В C++ тоже?</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="2022-11-28T12:38:02+00:00">28.11.22, 12:38</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=431434&view=findpost&p=3882134'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2022-11-28T11:06:25+00:00">28.11.22, 11:06</time></span><div class='quote '>Предлагайте свои варианты на других языках (статически типизированных, конечно).</div></div><br>
Тут вся фишка в С++ в том, что политиками ты статически как бы &quot;собираешь&quot; свой тип, но при этом ты ничем не жертвуешь в динамкие. Т.е. как будто ты сам писал все эти классы руками делал.<br>
Т.е. абстракция остается исключительно в коде, а не в итоговой программе. Не думаю, что в других языках такое есть.<br>
Может на неделе посмотрю, есть ли что-то такое в расте.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882134</guid>
        <pubDate>Mon, 28 Nov 2022 11:06:25 +0000</pubDate>
        <title>Шаблоны — примеры применения и альтернативы на других языках</title>
        <link>https://forum.sources.ru/index.php?showtopic=431434&amp;view=findpost&amp;p=3882134</link>
        <description><![CDATA[korvin: Пролистывая старые темы, наткнулся на <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=277350&view=findpost&p=2355593' target='_blank'>пример</a>.<br>
<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">оригинал на C++ от Qraizer</div><div class="body"><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">template &#60;typename MT_Policy&#62;</div><div class="code_line">class Foo: public MT_Policy</div><div class="code_line">{</div><div class="code_line">&nbsp;/* ... */</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;/* ... */</div><div class="code_line">&nbsp;void DoSomething()</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;this-&#62;lock();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;/* do something */</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;this-&#62;unclock();</div><div class="code_line">&nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// Реализация для однопоточного приложения</div><div class="code_line">class NoSync</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;void lock() &nbsp;{}</div><div class="code_line">&nbsp;void unlock(){}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// Реализация через критические секции</div><div class="code_line">class CT_Sync</div><div class="code_line">{</div><div class="code_line">&nbsp;CRITICAL_SECTION ct;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;CT_Sync(const CT_Sync&amp;);</div><div class="code_line">&nbsp;void operator=(const CT_Sync&amp;);</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;CT_Sync() &nbsp; { InitializeCriticalSection(&amp;ct); }</div><div class="code_line">&nbsp;~CT_Sync() &nbsp; { DeleteCriticalSection &nbsp; &nbsp;(&amp;ct); }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;void lock() &nbsp;{ EnterCriticalSection(&amp;ct); }</div><div class="code_line">&nbsp;void unlock(){ LeaveCriticalSection(&amp;ct); }</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// Реализация через мьютексы</div><div class="code_line">class Mutex_Sync</div><div class="code_line">{</div><div class="code_line">&nbsp;HANDLE hMutex;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;Mutex_Sync(const Mutex_Sync&amp;);</div><div class="code_line">&nbsp;void operator=(const Mutex_Sync&amp;);</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;Mutex_Sync(): hMutex(CreateMutex(NULL, FALSE, NULL))</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; if (hMutex == NULL) throw std::runtime_error(&quot;Can\&#39;t create a mutex&quot;);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;~Mutex_Sync() &nbsp; { CloseHandle(hMutex); }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;void lock() &nbsp;{ WaitForSingleObject(hMutex, INFINITE); }</div><div class="code_line">&nbsp;void unlock(){ ReleaseMutex(hMutex); }</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// Использование</div><div class="code_line">Foo&#60;CT_Sync&#62; &nbsp; &nbsp;privateFoo;</div><div class="code_line">Foo&#60;Mutex_Sync&#62; sharedFoo;</div><div class="code_line">Foo&#60;NoSync&#62; &nbsp; &nbsp; upToF_ckFoo;</div></ol></div></div></div></div><br>
</div></div><br>
Далее <strong class='tag-b'>IL_Agent</strong> привёл вариант на C#, заметив, что унаследоваться от параметра дженерика нельзя.<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">вариант на C# от IL_Agent</div><div class="body"><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 Foo&#60;Policy&#62; where Policy : ISync</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Policy sync = Activator.CreateInstance&#60;Policy&#62;();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public void DoSomething()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sync.Lock();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//...</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sync.Unlock();</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;interface ISync</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;void Lock();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;void Unlock(); &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;class NoSync:ISync</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public void Lock() { }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public void Unlock() { } &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;class SomeSync : ISync</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//...</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public SomeSync(){/*...*/ }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public void Lock() {/*...*/ }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public void Unlock(){/*...*/ }</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">//...</div><div class="code_line">var f1 = new Foo&#60;NoSync&#62;();</div><div class="code_line">var f2 = new Foo&#60;SomeSync&#62;();</div></ol></div></div></div></div><br>
</div></div><br>
Код упрощённый — в C# нет RAII, поэтому нужна ещё финализация (например, для политики с критической секцией).<br>
<br>
Также, <strong class='tag-b'>D_KEY</strong> заметил, что в C++ lock/unlock могут быть статическими функциями.<br>
В оригинальном примере они вызываются через this-&gt;, в Java можно вызывать статические функции через this. В C++ тоже?<br>
Или имелось в виду, что в шаблоне нужно вызывать их без this-&gt;, тогда можно будет использовать статические? Или нужен второй шаблон Foo для &quot;статического&quot; вида политик?<br>
<strong class='tag-b'>D_KEY</strong>, уточни, пожалуйста.<br>
<br>
Решил попробовать реализовать аналог на Ocaml и вот что получилось:<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">module type MT_policy =</div><div class="code_line">&nbsp;&nbsp;sig</div><div class="code_line">&nbsp;&nbsp; &nbsp;type t</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;class handler : object</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;val handle : t</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;method finalize : unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;val lock &nbsp; : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;val unlock : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">module Foo (Policy : MT_policy) : sig</div><div class="code_line">&nbsp;&nbsp;class t : object</div><div class="code_line">&nbsp;&nbsp; &nbsp;method do_something : unit</div><div class="code_line">&nbsp;&nbsp; &nbsp;method finalize &nbsp; &nbsp; : unit</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">end = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;class t = object</div><div class="code_line">&nbsp;&nbsp; &nbsp;inherit Policy.handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;method do_something =</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Policy.lock handle ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;print_endline &quot;do something&quot; ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Policy.unlock handle</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">(* ---------------------------------------------------------------- *)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;(* ----------------</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; external library</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; ---------------- *)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module CRITICAL_SECTION : sig</div><div class="code_line">&nbsp;&nbsp;type t</div><div class="code_line">&nbsp;&nbsp;val define &nbsp; &nbsp; : unit -&#62; t</div><div class="code_line">&nbsp;&nbsp;val initialize : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp;val delete &nbsp; &nbsp; : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp;val enter &nbsp; &nbsp; &nbsp;: t -&#62; unit</div><div class="code_line">&nbsp;&nbsp;val leave &nbsp; &nbsp; &nbsp;: t -&#62; unit</div><div class="code_line">end = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type t = int ref</div><div class="code_line">&nbsp;&nbsp;let define () = ref 0</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let log action sec = Printf.printf &quot;%s SEC %d\n&quot; action !sec</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let initialize sec = sec := 42 ; log &quot;INIT&quot; sec</div><div class="code_line">&nbsp;&nbsp;let delete &nbsp; &nbsp; sec = log &quot;DELETE&quot; sec ; sec := 0</div><div class="code_line">&nbsp;&nbsp;let enter &nbsp; &nbsp; &nbsp;sec = log &quot;ENTER&quot; sec</div><div class="code_line">&nbsp;&nbsp;let leave &nbsp; &nbsp; &nbsp;sec = log &quot;LEAVE&quot; sec</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module Mutex : sig</div><div class="code_line">&nbsp;&nbsp;type t</div><div class="code_line">&nbsp;&nbsp;val create &nbsp; : unit -&#62; t</div><div class="code_line">&nbsp;&nbsp;val wait_for : t -&#62; unit</div><div class="code_line">&nbsp;&nbsp;val release &nbsp;: t -&#62; unit</div><div class="code_line">end = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type t = Mx</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let create &nbsp; () = Mx</div><div class="code_line">&nbsp;&nbsp;let wait_for Mx = print_endline &quot;Waiting for mutex...&quot;</div><div class="code_line">&nbsp;&nbsp;let release &nbsp;Mx = print_endline &quot;Release mutex&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">(* ---------------------------------------------------------------- *)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module No_sync = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type t = unit</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;class handler = object</div><div class="code_line">&nbsp;&nbsp; &nbsp;val handle = ()</div><div class="code_line">&nbsp;&nbsp; &nbsp;method finalize = ()</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let lock &nbsp; () = print_endline &quot;no lock&quot;</div><div class="code_line">&nbsp;&nbsp;let unlock () = print_endline &quot;no unlock&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module CT_sync = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type t = CRITICAL_SECTION.t</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;class handler = object</div><div class="code_line">&nbsp;&nbsp; &nbsp;val handle = CRITICAL_SECTION.define ()</div><div class="code_line">&nbsp;&nbsp; &nbsp;method finalize = CRITICAL_SECTION.delete handle</div><div class="code_line">&nbsp;&nbsp;initializer</div><div class="code_line">&nbsp;&nbsp; &nbsp;CRITICAL_SECTION.initialize handle</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let lock &nbsp; = CRITICAL_SECTION.enter</div><div class="code_line">&nbsp;&nbsp;let unlock = CRITICAL_SECTION.leave</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">module MX_sync = struct</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;type t = Mutex.t</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;class handler = object</div><div class="code_line">&nbsp;&nbsp; &nbsp;val handle = Mutex.create ()</div><div class="code_line">&nbsp;&nbsp; &nbsp;method finalize = ()</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;let lock &nbsp; = Mutex.wait_for</div><div class="code_line">&nbsp;&nbsp;let unlock = Mutex.release</div><div class="code_line">&nbsp;</div><div class="code_line">end</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">(* ---------------------------------------------------------------- *)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">let new_foo (policy : (module MT_policy)) =</div><div class="code_line">&nbsp;&nbsp;let module F = Foo (val policy) in</div><div class="code_line">&nbsp;&nbsp;new F.t</div><div class="code_line">&nbsp;</div><div class="code_line">type &#39;a finalizable =</div><div class="code_line">&nbsp;&nbsp;&#60; finalize : unit</div><div class="code_line">&nbsp;&nbsp;; .. &#62; as &#39;a</div><div class="code_line">&nbsp;</div><div class="code_line">let using : &#39;a finalizable -&#62; (&#39;a -&#62; unit) -&#62; unit</div><div class="code_line">&nbsp;&nbsp;= fun res f -&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;f res ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;res #finalize</div><div class="code_line">&nbsp;</div><div class="code_line">let _ =</div><div class="code_line">&nbsp;&nbsp;using (new_foo (module CT_sync)) @@ fun private_foo -&#62;</div><div class="code_line">&nbsp;&nbsp;using (new_foo (module MX_sync)) @@ fun shared_foo -&#62;</div><div class="code_line">&nbsp;&nbsp;using (new_foo (module No_sync)) @@ fun up_to_f_ck_foo -&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;print_endline &quot;---- doing something...&quot; ;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;private_foo &nbsp; &nbsp;# do_something ;</div><div class="code_line">&nbsp;&nbsp;shared_foo &nbsp; &nbsp; # do_something ;</div><div class="code_line">&nbsp;&nbsp;up_to_f_ck_foo # do_something ;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;print_endline &quot;---- finalizing...&quot;</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">INIT SEC 42</div><div class="code_line">---- doing something...</div><div class="code_line">ENTER SEC 42</div><div class="code_line">do something</div><div class="code_line">LEAVE SEC 42</div><div class="code_line">Waiting for mutex...</div><div class="code_line">do something</div><div class="code_line">Release mutex</div><div class="code_line">no lock</div><div class="code_line">do something</div><div class="code_line">no unlock</div><div class="code_line">---- finalizing...</div><div class="code_line">DELETE SEC 42</div></ol></div></div></div></div><br>
— <a class='tag-url' href='https://www.jdoodle.com/ia/Acd' target='_blank'>https://www.jdoodle.com/ia/Acd</a><br>
<br>
В Ocaml тоже нет RAII, поэтому нужна явная финализация. В остальном: функции lock/unlock полностью абстрактные, могут быть «статическими», могут — не быть, например, в конкретной политике можно реализовать тип t как класс с методами lock/unlock, которые будут вызываться из функций. Класс Policy.handler можно наследовать, можно — не наследовать.<br>
<br>
Предлагайте свои варианты на других языках (статически типизированных, конечно).<br>
C# там уже был; Java, наверное, не будет от него отличаться слишком (хотя, вдруг, у кого есть альтернативные идеи).<br>
Может, тут Swift&#39;ингеры есть? Или Rust&#39;оманы? Или <strong class='tag-b'>D_KEY</strong> вспомнит Scala? =)<br>
<br>
Также было бы интересно увидеть ещё какие-нибудь подобные примеры использования шаблонов.<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray">(Наверняка, они были в тех многочисленных старых холиварах, но копаться там — занятие такое себе. А тут можно было бы собрать несколько интересных примеров в одной теме)</span>]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      </channel>
      </rss>
	