<?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=427644&amp;view=findpost&amp;p=3867180</guid>
        <pubDate>Wed, 01 Jun 2022 18:26:43 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867180</link>
        <description><![CDATA[Eric-S: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427644&view=findpost&p=3867167'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T20:57:17+03:00">01.06.22, 17:57</time></span><div class='quote '>Нынче этот SFINAE является основной движущей силой в &lt;type_traits&gt; та и не только там. Ну коли гора к Магомеду задом... мы не гордые, повернём Магомеда передом к горе сами. Конечно лучше это инкапсулировать куда-нибудь. <br>
<br>
Формально этот метакод исполняет алгоритм «Если параметр одной из перегрузок check_noexcept() не подходит, выбери другую перегрузку и скажи, какую выбрал;</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">/// @brief получает тип указателя на функцию</div><div class="code_line">/// @param CALLABLE вызываемая функция.</div><div class="code_line">/// @return &nbsp;тип указателя на функцию.</div><div class="code_line">#define CALLABLE_TYPE( CALLABLE ) \</div><div class="code_line">callable_type&#60; decltype( CALLABLE ), decltype( has_noexcept( CALLABLE ) ) &#62;::type</div><div class="code_line">&nbsp;</div><div class="code_line">/// @brief проверка установленного модификатора noexcept</div><div class="code_line">/// @param[in] callable проверяемый указатель на функцию</div><div class="code_line">/// @return результат проверки.</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">[[nodiscard]] inline constexpr auto has_noexcept( [[maybe_unused]] ResultType( *callable )( ArgsType... ) ) noexcept -&#62; false_type</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return false_type();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">/// @brief проверка установленного модификатора noexcept</div><div class="code_line">/// @param[in] callable проверяемый указатель на функцию</div><div class="code_line">/// @return результат проверки.</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">[[nodiscard]] inline constexpr auto has_noexcept( [[maybe_unused]] ResultType( *callable )( ArgsType... ) noexcept ) noexcept -&#62; true_type</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return true_type();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">/// @brief преобразует &nbsp;вызываемый тип в тип указателя на функцию</div><div class="code_line">/// @tparam CallableType тип вызываемой функции.</div><div class="code_line">/// @tparam IsNoexcept флаг установки noexcept.</div><div class="code_line">template&#60; typename CallableType, typename IsNoexcept &#62;</div><div class="code_line">struct callable_type;</div><div class="code_line">&nbsp;</div><div class="code_line">/// @brief преобразует &nbsp;вызываемый тип в тип указателя на функцию</div><div class="code_line">/// @tparam ResultType тип возвращаемого результата.</div><div class="code_line">/// @tparam ArgsType тип аргументов вызова.</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">struct callable_type&#60; ResultType( * )( ArgsType... ), false_type &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;using type = typename ResultType( * )( ArgsType... );</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">/// @brief преобразует &nbsp;вызываемый тип в тип указателя на функцию</div><div class="code_line">/// @tparam ResultType тип возвращаемого результата.</div><div class="code_line">/// @tparam ArgsType тип аргументов вызова.</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">struct callable_type&#60; ResultType( * )( ArgsType... ) noexcept, true_type &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;using type = typename ResultType( * )( ArgsType... );</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Eric-S</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867167</guid>
        <pubDate>Wed, 01 Jun 2022 17:57:17 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867167</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427644&view=findpost&p=3867158'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eric&#045;S &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T17:32:20+00:00">01.06.22, 17:32</time></span><div class='quote '>Очень интересное и своеобразное решение. Наверное, его можно даже упростить, используя inline constexpr функции, возвращающие bool. Спасибо. Подумаю и попробую.</div></div>Во времена C++03 принцип SFINAE руками эксплуатировался настолько часто, что даже сейчас у меня руки этот код написали, почитай, сами, голова в этом не участвовала. Нынче этот SFINAE является основной движущей силой в &lt;type_traits&gt; та и не только там. Ну коли гора к Магомеду задом... мы не гордые, повернём Магомеда передом к горе сами. Конечно лучше это инкапсулировать куда-нибудь. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-06-01T18:05:49+00:00">01.06.22, 18:05</time></span></span><br>
P.S. Формально этот метакод исполняет алгоритм «Если параметр одной из перегрузок check_noexcept() не подходит, выбери другую перегрузку и скажи, какую выбрал; если не выбрал ничего, остановись с ошибкой». Обе перегрузки имеют параметрами указатели на функции, поэтому любые, что не такие, отклонят обоих кандидатов. Те, что подходят, взаимоисключаются спецификатором, поэтому не могут быть выбраны одновременно, так что у компилятора останется ровно один кандидат. Какой именно, определяется возвращаемым значением, которые спецом выбраны так, что имеют гарантированно разные размеры. Плюс эксплуатируется тот факт, что sizeof() всегда исполняется на стадии компиляции.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867158</guid>
        <pubDate>Wed, 01 Jun 2022 17:32:20 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867158</link>
        <description><![CDATA[Eric-S: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427644&view=findpost&p=3867145'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T17:01:35+00:00">01.06.22, 17:01</time></span><div class='quote '>А если проще?</div></div><br>
Очень интересное и своеобразное решение. Наверное, его можно даже упростить, используя inline constexpr функции, возвращающие bool. Спасибо. Подумаю и попробую. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-06-01T17:34:38+00:00">01.06.22, 17:34</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427644&view=findpost&p=3867145'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T17:01:35+00:00">01.06.22, 17:01</time></span><div class='quote '>Эх, были времена, когда в Стандарте не было никакого метапрограммирования. Всё руками, всё руками...</div></div><br>
Так лениво же руками  повторять одно и тоже. А вот что-нибудь этакое, да ещё   само выполняющее работу... Так что  автоматизация и ещё раз автоматизация.]]></description>
        <author>Eric-S</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867145</guid>
        <pubDate>Wed, 01 Jun 2022 17:01:35 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867145</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">typedef &nbsp; &nbsp; &nbsp; &nbsp; char &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;small_type;</div><div class="code_line">typedef struct {char dummy[2];} big_type;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename ResultType, typename ...ArgsType&#62; small_type check_noexcept(ResultType (*)(ArgsType...));</div><div class="code_line">template &#60;typename ResultType, typename ...ArgsType&#62; big_type &nbsp; check_noexcept(ResultType (*)(ArgsType...) noexcept);</div><div class="code_line">&nbsp;</div><div class="code_line">/* проверяем */</div><div class="code_line">void may_throw();</div><div class="code_line">void no_throw() noexcept;</div><div class="code_line">&nbsp;</div><div class="code_line">constexpr bool throw_true = sizeof(check_noexcept(may_throw)) == sizeof(small_type);</div><div class="code_line">constexpr bool throw_false= sizeof(check_noexcept(no_throw)) &nbsp;== sizeof(small_type);</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-06-01T17:05:56+00:00">01.06.22, 17:05</time></span></span><br>
Эх, были времена, когда в Стандарте не было никакого метапрограммирования. Всё руками, всё руками...]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867138</guid>
        <pubDate>Wed, 01 Jun 2022 15:53:08 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867138</link>
        <description><![CDATA[Eric-S: Шаманил. И так и сяк крутил. Не хотел компилятор различать noexcept в шаблонах.<br>
<br>
В итоге сляпал грубый костыль для получения типа указателя на функцию, без модификатора noexcept.<br>
<br>
Шаблон remove_noexcept, первым параметром  тип  указателя на функцию, а вторым параметром флаг есть ли noexcept. Увы, у меня автоматически не определяет наличие noexcept, только ругается.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">template&#60; typename CallableType, bool IsNoexcept &#62;</div><div class="code_line">struct remove_noexcept;</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">struct remove_noexcept&#60; ResultType( * )( ArgsType... ), false &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;using type = typename ResultType( * )( ArgsType... );</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">struct remove_noexcept&#60; ResultType( * )( ArgsType... ) noexcept, true &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;using type = typename ResultType( * )( ArgsType... );</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">struct remove_noexcept&#60; ResultType( &amp; )( ArgsType... ), false &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;using type = typename ResultType( * )( ArgsType... );</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">struct remove_noexcept&#60; ResultType( &amp; )( ArgsType... ) noexcept, true &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;using type = typename ResultType( * )( ArgsType... );</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">struct remove_noexcept&#60; ResultType( *&amp; )( ArgsType... ), false &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;using type = typename ResultType( * )( ArgsType... );</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">struct remove_noexcept&#60; ResultType( *&amp; )( ArgsType... ) noexcept, true &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;using type = typename ResultType( * )( ArgsType... );</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div></ol></div></div></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">#define &nbsp;REMOVE_NOEXCEPT( FUNCNAME, ... ) remove_noexcept&#60; decltype( FUNCNAME ), noexcept( FUNCNAME( __VA_ARGS__ ) ) &#62;::type</div></ol></div></div></div></div><br>
<br>
Первый параметр указатель на функцию. Последующие параметры, это параметры передаваемые в функцию. А возвращает тип указателя на функцию.<br>
<br>
Ну или как-то так. Мой код теперь компилируется. А про рефакторинг подумаю завтра.]]></description>
        <author>Eric-S</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867134</guid>
        <pubDate>Wed, 01 Jun 2022 13:46:06 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867134</link>
        <description><![CDATA[Eric-S: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427644&view=findpost&p=3867126'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T12:41:22+00:00">01.06.22, 12:41</time></span><div class='quote '>однако Стандарт не содержит требований для этого. В 18-м году было внесено предложение считать это дефектом и открыто голосование. Буквально 7 мая сего года оно было одобрено.</div></div><br>
О как&#33; Спасибо&#33; Видимо я как раз наткнулся. Компилятор ведёт себя странно. Параметр не выводит. Путается в типах.]]></description>
        <author>Eric-S</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867126</guid>
        <pubDate>Wed, 01 Jun 2022 12:41:22 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867126</link>
        <description><![CDATA[Qraizer: Поисследовал проблему. Начиная с C++17 спецификация noexcept является частью типа, поэтому функции (и методы с операторами, естественно), отличающиеся лишь этим спецификатором, частично совместимы друг с другом. Т.е., например, указателю на noexcept(true) можно присвоить noexcept(false), но не наоборот. Однако при сопоставлении типов совместимость не применяется и требуется точное соответствие. Формально реализации способны вывести значение noexcept(), т.к. для каждого типа это представляет собой значение периода компиляции, однако Стандарт не содержит требований для этого. В 18-м году было внесено предложение считать это дефектом и открыто голосование. Буквально 7 мая сего года оно было одобрено.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867077</guid>
        <pubDate>Wed, 01 Jun 2022 09:10:01 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867077</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427644&view=findpost&p=3867075'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eric&#045;S &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T08:48:52+00:00">01.06.22, 08:48</time></span><div class='quote '>Пока решил сделать две специализации, для noexcept( false ) и noexcept( true ), добавив шаблону параметр bool IsNoexcept.</div></div><br>
Ну да, так конечно легче будет. Согласен.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867075</guid>
        <pubDate>Wed, 01 Jun 2022 08:48:52 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867075</link>
        <description><![CDATA[Eric-S: [QUOTE=Majestio,1654072481,3867072]принимает указатели на функции без noexcept[/quote]<br>
Как вариант для попытки решения ... может как-то впилить в код обертку в виде std::function? Может это как-то поможет...[/QUOTE]<br>
Хотелось бы получить   вариант  лёгкого кода, без излишеств, самый минимум, только хардкор. Увы, std::function его заметно утяжеляет.<br>
<br>
Пока решил сделать две специализации,  для noexcept( false ) и  noexcept( true ), добавив  шаблону параметр  bool IsNoexcept.<br>
<br>
А этот самый параметр устанавливать явно, вызвав  noexcept( funcname( args... ) ). Решение грубое, но в теории должно сработать.]]></description>
        <author>Eric-S</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867072</guid>
        <pubDate>Wed, 01 Jun 2022 08:34:41 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867072</link>
        <description><![CDATA[Majestio: Интересный вопрос&#33; Но ответа, увы, нет. Подписываюсь на уведомления :good: <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-06-01T08:37:13+00:00">01.06.22, 08:37</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427644&view=findpost&p=3867063'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eric&#045;S &#064; <time class="tag-quote__quoted-time" datetime="2022-06-01T07:59:38+00:00">01.06.22, 07:59</time></span><div class='quote '>принимает указатели на функции без noexcept</div></div><br>
Как вариант для попытки решения ... может как-то впилить в код обертку в виде std::function? Может это как-то поможет...]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867063</guid>
        <pubDate>Wed, 01 Jun 2022 07:59:38 +0000</pubDate>
        <title>noexcept в параметре шаблона типа указателя на функцию</title>
        <link>https://forum.sources.ru/index.php?showtopic=427644&amp;view=findpost&amp;p=3867063</link>
        <description><![CDATA[Eric-S: Здравствуйте&#33;<br>
<br>
С удивлением обнаружил, что  noexcept  влияет на тип шаблона.<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">template&#60; typename CallableType &#62;</div><div class="code_line">class callable_wrapper;</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">class callable_wrapper&#60; ResultType( * )( ArgsType... ) &#62;</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;using result_type = ResultType;</div><div class="code_line">};</div></ol></div></div></div></div><br>
<br>
Шаблон класса callable_wrapper,  для обёртки указателя на функцию и  вызова этой функции.  (Здесь я порезал код вызова.( Он у меня используется в качестве базового класса, если кому-то интересно.<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">callable_wrapper&#60; decltype( &amp;funcname ) &#62;( &amp;funcname );</div></ol></div></div></div></div><br>
<br>
Внезапно, выяснил, что  этот шаблон класса, принимает указатели  на функции без  noexcept. А если  передать noexcept, то оно  не компилируется.<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">template&#60; typename ResultType, typename ...ArgsType &#62;</div><div class="code_line">class callable_wrapper&#60; ResultType( * )( ArgsType... ) noexcept &#62;</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;using result_type = ResultType;</div><div class="code_line">};</div></ol></div></div></div></div><br>
И получилось наоборот. Принимает только noexcept, а без noexcept уже ошибка.<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">template&#60; typename ResultType, typename ...ArgsType, bool IsNoexcept &nbsp;&#62;</div><div class="code_line">class callable_wrapper&#60; ResultType( * )( ArgsType... ) noexcept( IsNoexcept ) &#62;</div></ol></div></div></div></div><br>
<br>
Но в таком варианте  не компилируется, невозможно вывести параметр шаблона.<br>
<br>
Возникло несколько вопросов:<br>
<ol class="tag-list" type="1"><li>Придётся делать вторую специализацию шаблона, отдельно  для noexcept и отдельно без  noexcept? Или лучше совместить? Меня бы устроило приведение всех  функций  к  noexcept.</li><li>А какие атрибуты ещё влияют на тип указателя функции, также как noexcept?</li><li>Есть ли возможность  определить в  compile-time наличие атрибутов  noreturn, nodiscard?</li><li>Что происходит с модификаторами  __stdcall, __cdecl и другими, при  передаче  указателя в тип шаблона? Они же изменяют тип. Но почему-то  шаблоны не специализируются.</li></ol>]]></description>
        <author>Eric-S</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	