<?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=437120&amp;view=findpost&amp;p=3895811</guid>
        <pubDate>Thu, 12 Oct 2023 18:02:28 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3895811</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>Qraizer</strong>, ну ок. Давай по порядку...<br>
<br>
1) Напиши (ну<strong class='tag-b'> или <span class="tag-color tag-color-named" data-value="red" style="color: red">процитируй себя</span></strong>) - когда это се нужно (примеры), когда без всего этого остальные решения просто левый ацтой? Но обязательно так, чтобы это решение не было просто-на-просто конкурирующем, а было явно доминирующем?<br>
2) Дальше посмотрим ...]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3895751</guid>
        <pubDate>Wed, 11 Oct 2023 11:48:27 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3895751</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3894766'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-09-08T18:46:07+00:00">08.09.23, 18:46</time></span><div class='quote '>Ну так я и привёл. Чем не нравится-то?</div></div>]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3895729</guid>
        <pubDate>Tue, 10 Oct 2023 20:45:57 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3895729</link>
        <description><![CDATA[Majestio: Мож я чего не так выразил, сорян конечно&#33;<br>Но, тем не менее, на четыре вопроса есть чего? Реально важно и нужно. И если будет - пусть будет тут.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894767</guid>
        <pubDate>Fri, 08 Sep 2023 18:51:00 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894767</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3894766'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-09-08T18:46:07+00:00">08.09.23, 18:46</time></span><div class='quote '>Чем не нравится-то?</div></div><br>
&quot;Приведением&quot;. Хотелось бы более определённо:<br>
<br>
1) постановка задачи<br>
2) некрасивый метод<br>
3) красивый метод<br>
4) выводы]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894766</guid>
        <pubDate>Fri, 08 Sep 2023 18:46:07 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894766</link>
        <description><![CDATA[Qraizer: Ну так я и привёл. Чем не нравится-то?]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894765</guid>
        <pubDate>Fri, 08 Sep 2023 18:32:13 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894765</link>
        <description><![CDATA[Majestio: <div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3894763'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-09-08T17:50:37+00:00">08.09.23, 17:50</time></span><div class='quote '>С пятницей, Majestio&#33;</div></div><br>
Ну тя и чуйка&#33;  :blink: С 9 мая а ограничивал свою диету в плане алкоголя, и только сёння решился отведать студеной в морозильнике воткэ ... С разными очень вкусными яствами&#33;  :blink: </div></div><br>
Про отца-основателя не нужно - не асилим, давай на пальцах, ога? Я тебя спрашиваю про &quot;практическое применение&quot; а ты сорян &quot;съезжаешь&quot; в мульти-методы. Нет, мульти-методы &quot;в вакууме&quot; не нужны - нужен практический пример. Но и даже не тут &#33;&#33;&#33; Мы же пока обсуждаем просто поля классов и ссылки на них. Про методы и мульти-методы поговорим потом. <br>
<br>
<strong class='tag-b'>Итак, повтор вопроса, чем ценны ссылки на поля и пример их использования для достижения высшего качества?</strong><br>
<br>
есть что сказать и показать на примерах?]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894764</guid>
        <pubDate>Fri, 08 Sep 2023 17:56:12 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894764</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3894762'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-09-08T17:30:21+00:00">08.09.23, 17:30</time></span><div class='quote '>Простой &quot;Перловский&quot; подход - &quot;не знаешь что будет - загоняй всё в хэши&quot;</div></div>У &quot;нас&quot; загоняют в вектора. Ну, у меня был известен размер, так что массив. O(1) рулит. За наносекунды если... RTTI не рассматриваю, а вот вариант реализации на Visitor спорит с &quot;нативной&quot; реализацией, описанной у <a class='tag-url' href='https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2216.pdf' target='_blank'>отца-основателя</a>, но так и не реализованной в Стандарте. И это притом, что у него там двупараметрические, а у меня произвольные, причём ещё и с определяемой связностью параметров: где надо, позднее, где не надо, раннее. Как скажешь, так и будет. <a class='tag-url' href='https://metacpan.org/pod/Class::Multimethods' target='_blank'>Ваши</a> не конкуренты, в общем.<br>
<br>
P.S. Интересно ещё было бы сравнить с языками с искаробочной поддержкой множественной динамической диспетчеризации. Насколько я понял, самая прозрачная поддержка у Common Lisp-а, но что-то я там не увидел декларативности в сопоставлении, только тупое полное перечисление всех вариантов комбинаций. Ну т.е. если у меня, скажем, три иерархии по десятку классов в каждой, то будь добр накидать 10<sup class='tag-sup'>3</sup> переопределений. Хотя могу ошибаться, не спец в нём.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894762</guid>
        <pubDate>Fri, 08 Sep 2023 17:30:21 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894762</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3894752'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-09-08T14:06:46+00:00">08.09.23, 14:06</time></span><div class='quote '>Ну а часто ли тебе нужен offsetof(), Majestio? Необходимость в указателях на поля будет не намного чаще. Но когда она возникнет, не будет стирания типов и уменьшится человеческий фактор из-за ошибок в адресной арифметике.<br>
Я использовал. Не то чтобы прям без них никак, но удобно (кусочек):</div></div><br>
Хе-хе  ;)  Вставлю свои пять копеек. Ты же знаешь, ну или может быть помнишь - моей &quot;нормальной&quot; стартовой базой входа в программинг был Пасквиль, сперва Turbo, потом Virtual, и потом очень немножечко Дэлфи. Все эти &quot;рéкорды&quot; я полюбил сразу, как родных... Но потом я повстречал Perl :lol: Там только скаляры, вектора и хэши (на слэнге С++ &quot;упорядоченные карты&quot;, ну или просто &quot;карты&quot;)<br>
<br>
<strong class='tag-b'>И сразу всё смотрится как-то иначе, а зачем нам куча предопределенных полей какой-то железяки, если в перспективе их будут тыщчы или даже стопицот, возможно тыщ??? </strong><br>
<br>
Простой &quot;Перловский&quot; подход - &quot;не знаешь что будет - загоняй всё в хэши&quot;  :rolleyes: А-б-и-с-ь-н-я-ю свою точку зрения ... Линейка продуктов имеет в &quot;прапертях&quot; всё неугомонно расширяющуюся &quot;палитру&quot; прапертей, ну не угнацца <span class="tag-color tag-color-named" data-value="red" style="color: red">щит</span> (<strong class='tag-b'>Q</strong>)&#33; Но и мы сами с усами ...<br>
<br>
1) Если не парить быстродействие, помним - загоняем всё в хэши<br>
2) А если быстродействие парит - загоняем в вектора и именуем индексы <strong class='tag-b'>enum</strong>&#39;ами, при необходимости <a class='tag-url' href='https://github.com/bravikov/super_enum/blob/master/README.ru.md' target='_blank'>используем страшную клизму</a><br>
<br>
Про указатели на методы классов отпишу позже. Возможно и тут зарубимся по наносекундам, не хочется опережать события) <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3894752'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-09-08T14:06:46+00:00">08.09.23, 14:06</time></span><div class='quote '>но удобно (кусочек)</div></div><br>
Если надо - код запилю. Но не мне тебе код писать, ты и сам уже всё прекрасно понимаешь и визуализируешь ;)]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894752</guid>
        <pubDate>Fri, 08 Sep 2023 14:06:46 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894752</link>
        <description><![CDATA[Qraizer: Ну а часто ли тебе нужен offsetof(), <strong class='tag-b'>Majestio</strong>? Необходимость в указателях на поля будет не намного чаще. Но когда она возникнет, не будет стирания типов и уменьшится человеческий фактор из-за ошибок в адресной арифметике.<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">&nbsp;&nbsp;comPort[BitRate ]=uart_rate;</div><div class="code_line">&nbsp;&nbsp;comPort[StopBits]=stop_bits;</div><div class="code_line">&nbsp;&nbsp;comPort[fDTRCtrl]=DTR_CONTROL_ENABLE; // всегда готовы принимать</div><div class="code_line">&nbsp;&nbsp;comPort[fXonXoff]=FALSE; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// управление передатчиком при приёме программных сигналов</div><div class="code_line">&nbsp;&nbsp;comPort[fNullRcv]=</div><div class="code_line">&nbsp;&nbsp;comPort[fErrRplc]=</div><div class="code_line">&nbsp;&nbsp;comPort[fErrCtrl]=FALSE;</div><div class="code_line">&nbsp;&nbsp;comPort[fBinary ]= &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// данные бинарные</div><div class="code_line">&nbsp;&nbsp;comPort[fParity ]=TRUE;</div><div class="code_line">&nbsp;&nbsp;comPort[readChar] =MAXDWORD; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// при чтении ждём...</div><div class="code_line">&nbsp;&nbsp;comPort[readMult] =0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ... с первого символа...</div><div class="code_line">&nbsp;&nbsp;comPort[readAdd ] =0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ... и до первой паузы</div><div class="code_line">&nbsp;&nbsp;comPort[writeMult]=0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // записываем без пауз...</div><div class="code_line">&nbsp;&nbsp;comPort[writeAdd] =1000; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// ... до секундого запрета передачи</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>В классе CComm:<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">&nbsp;&nbsp;TProp &nbsp; &nbsp;operator[](IProp&amp;) &nbsp; const; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Свойства</div><div class="code_line">&nbsp;&nbsp;TTimeOut operator[](ITimeOut&amp;)const;</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">class TProp { /* ... */ };</div><div class="code_line">&nbsp;</div><div class="code_line">class IPropDWord: public IProp { /* ... */ };</div><div class="code_line">class IPropWord: public IProp { /* ... */ };</div><div class="code_line">class IPropByte: public IProp { /* ... */ };</div><div class="code_line">class ITimeOut { /* ... */ };</div><div class="code_line">&nbsp;</div><div class="code_line">IPropDWord BitRate &nbsp;(&amp;DCB::BaudRate );</div><div class="code_line">IPropByte &nbsp;ByteSize (&amp;DCB::ByteSize );</div><div class="code_line">IPropByte &nbsp;StopBits (&amp;DCB::StopBits );</div><div class="code_line">IPropByte &nbsp;Parity &nbsp; (&amp;DCB::Parity &nbsp; );</div><div class="code_line">/* ... */</div><div class="code_line">ITimeOut &nbsp; readChar (&amp;COMMTIMEOUTS::ReadIntervalTimeout);</div><div class="code_line">ITimeOut &nbsp; readMult (&amp;COMMTIMEOUTS::ReadTotalTimeoutMultiplier);</div><div class="code_line">ITimeOut &nbsp; readAdd &nbsp;(&amp;COMMTIMEOUTS::ReadTotalTimeoutConstant);</div><div class="code_line">ITimeOut &nbsp; writeMult(&amp;COMMTIMEOUTS::WriteTotalTimeoutMultiplier);</div><div class="code_line">ITimeOut &nbsp; writeAdd (&amp;COMMTIMEOUTS::WriteTotalTimeoutConstant);</div></ol></div></div></div></div>Конфигурирование через пропертя. 20 лет назад казалось прикольным.<br>
Вот ещё пример из кода заказчика. Шелезяка. У него восемь ADC, разбитных по 8-и регионам в адресном пространстве, и каждый сколько-то там регистров. В заголовках процессора ADC представлен структурой, а все ADC 8-ю соответствующими указателями на абсолютные адреса этих регионов. Удобно? Вполне. Но вот ОСи нередко требуется с ними обращаться в цикле. А циклу имена не передашь, он хочет индексы. Что они сделали? Правильно догадался: создали массив из указа... в смысле offsetof()-ов на поля, на Cях писано. <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="2023-09-08T14:36:39+00:00">08.09.23, 14:36</time></span></span><br>
С указателями на методы аналогично. Но и сложнее. Вообще, было бы просто странно, если б были указатели на поля, но не было бы на методы. С другой стороны... вот когда нам нужна параметризация поведения, что мы делаем в C? У нас там есть указатели на функции. В Плюсах они, вообще говоря, уже не так востребованы, потому что у нас есть полиморфизм. Те же указатели, но скрытые под капотом и управляемые компилятором. Поэтому указатели на методы всплывают там, где требуется ещё более глубокая параметризация. Мне она понадобилась в том же контексте, что у заказчика с его ADC. Мне нужно было собрать методы в массив и индексировать.<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">&nbsp;&nbsp; &nbsp;// внутренняя VMT - массив методов Accept();</div><div class="code_line">&nbsp;&nbsp; &nbsp;// в отличие от RTTI-&quot;матрицы&quot; sheet, у каждого параметра мультиметода она своя и потому</div><div class="code_line">&nbsp;&nbsp; &nbsp;// должна строиться в run-time, чем конструкторы LastAcceptorCaller и занимаются</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret_type (MD::*accepts[Length&#60;typename CTL::Head::TypeList&#62;::value])(param_type);</div><div class="code_line">&nbsp;</div><div class="code_line">/* ... */</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// это все апцепторы в иерархии, кроме самого базового</div><div class="code_line">&nbsp;&nbsp;template &#60;typename L, typename R, typename CTL, typename PTL, typename TPL, typename SRC,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;typename SHT, typename MD&#62;</div><div class="code_line">&nbsp;&nbsp;struct IterAcceptorCaller&#60;ret_type, TList&#60;L, R&#62;, CTL, PTL, TPL, SRC, SHT, MD&#62; :</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;public IterAcceptorCaller&#60;ret_type, R, CTL, PTL, TPL, SRC, SHT, MD&#62;</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">/*... */</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* восстановление типа очередного параметра, генерация следующего акцептора, передача ему</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; следующего среза списка акцепторов, базовых типов параметров мультиметода, RTTI-матрицы итп</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; и накопленной восстановленной информации о динамических типах и его вызов. */</div><div class="code_line">&nbsp;&nbsp; &nbsp;typedef typename MostBase&#60;typename CTL::Head::TypeList&#62;::type &nbsp; most_base;</div><div class="code_line">&nbsp;&nbsp; &nbsp;typedef typename CTL::Head::template ParamType&#60;most_base&#62;::type param_type;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret_type Accept(param_type arg)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;typedef typename SHT::base_type SheetType;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;typedef typename AcceptorMaker&#60;ret_type, typename CTL::Tail, TList&#60;arg_type, PTL&#62;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; typename TPL::base_type, SRC, SheetType&#62;::type acceptor;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// следующий акцептор</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;acceptor a(base_type::m_Params, static_cast&#60;typename TPL::base_type&amp;&#62;(base_type::m_Args),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; static_cast&#60;const SheetType&amp;&#62;(base_type::m_Sht));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// поиск в RTTI-массиве элемента, соответствующего динамическому типу пришедшего в диспетчер</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// аргумента, и получение его индекса в исходном списке типов, описывающем его иерархию</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;auto idx = std::lower_bound(std::begin(base_type::m_Sht.get()), std::end(base_type::m_Sht.get()),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;details::TypeInfo(CTL::Tail::Head::deref(GetField&#60;0&#62;(base_type::m_Args))));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// т.к. поиск не обязан давать точное совпадение и может только указать место в сортированном</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// контейнере, где ему было бы самое место, нужно самостоятельно убедиться в том, что элемент</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// успешно найден; в противном случае это означает ошибку в описании списка типов в иерархии</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if ( idx == std::end(base_type::m_Sht.get()) ||</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;!CTL::Tail::Head::check(*idx, CTL::Tail::Head::deref(GetField&#60;0&#62;(base_type::m_Args))))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;throw std::invalid_argument(&quot;IterAcceptorCaller&#60;&#62; error: unlisted parameter&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// индексируем внутреннюю VMT, вызывая Accept() того акцептора, чей индекс вернул поиск</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// в RTTI-массиве, и передавая аргумент мультиметода, т.с. восстанавливая его тип;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// в результате итерируемся к обработке следующего параметра</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return (a.self -&#62;* a.accepts[idx-&#62;index()])(GetField&#60;0&#62;(base_type::m_Args));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;};</div><div class="code_line">/* .. */</div><div class="code_line">&nbsp;&nbsp;// это базовый в иерархии акцептор; весь список типов иерархии параметра уже обработан производными</div><div class="code_line">&nbsp;&nbsp;// классами, так что этот с ними уже не работает, он только обслуживает внутреннюю VMT</div><div class="code_line">&nbsp;&nbsp;template &#60;typename CTL, typename PTL, typename TPL, typename SRC, typename SHT, typename MD&#62;</div><div class="code_line">&nbsp;&nbsp;struct LastAcceptorCaller&#60;ret_type, NullType, CTL, PTL, TPL, SRC, SHT, MD&#62;</div><div class="code_line">/* ... */</div></ol></div></div></div></div>Весь код можно увидеть на GitHab-е или у нас в темах по мультиметодам. Для восстановления динамического типа используется RTTI, методика основана на предварительном заполнении сортированного массива проксями к std::type_info на основе std::type_info::before() с последующим поиском в нём восстанавливаемого параметра. В итоге имеем индекс. Преобразование индекса в тип осуществляется созданием иерархии акцепторов, шаблонных классов, конкретизируемых нужным типом каждый. Чей XXXXAcceptorCaller::Accept() вызвался, тот аргумент шаблона и восстановлен. Как-то так... <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="2023-09-08T14:47:43+00:00">08.09.23, 14:47</time></span></span><br>
Вообще, наличие инструмента подразумевает, что где-то он полезен. Тот факт, что он маловостребован, не означает, что он не нужен. Если указатели на поля при их отсутствии можно моделировать offsetof(), то вот для указателей на методы альтернативы нет. К тому же, тут спорить не буду, легко можно не понимая инструмента, не заметить, что вот конкретно вот тут вот ему самое место и, даже если знаешь о его наличии, в итоге накодить костыль.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894728</guid>
        <pubDate>Fri, 08 Sep 2023 06:00:18 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894728</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>Qraizer</strong>, тема понятная давно, но с практической точки зрения, остается какой-то мутной, лично для меня. У тебя есть примеры, когда использование указателей на методы (а тем более - указатели на поля) класса - решали бы какие-то задачи, которые иначе решить невозможно. Ну или решение было бы такое оптимизированное, что стоило бы этим заморачиваться в обязательном порядке?]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894721</guid>
        <pubDate>Thu, 07 Sep 2023 14:41:03 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894721</link>
        <description><![CDATA[Qraizer: Статье 20 лет, она очень старая. И автор, похоже, просто не понимает толком, о чём пишет. Что вполне объяснимо, в то время язык большинством программистов ещё находился в стадии исследования.<ul class="tag-list"><li>Автор зациклен на делегатах. Такое впечатление, что других предназначений для указателей на методы он просто не видит. Ну что сказать... в Плюсах нет интерфейсов, и поначалу это ставили ему в вину. Недолго, потом перестали, когда осознали, что с их ролью прекрасно справляются абстрактные классы, но абстрактные классы умеют и многое другое, что недоступно интерфейсам. </li><li>Автора ставит в тупик необычные свойства указателей на методы, применяемые в пределах иерархий классов. Если б он капельку подумал, то легко бы понял, почему они такие. Почему разрешён неявный каст ссылок на производные классы к публичным базовым классам и почему для указателей на методы с точностью до наоборот, для меня, например, очевидно.</li><li>Автор при кастах между классами иерархии обсуждает reinterpret_cast&lt;&gt;. ... ... ... Что?? По ходу он вообще не понимает о чём пишет. И дело тут вообще не в указателях на методы. Внутри полиморфной иерархии reinterpret_cast&lt;&gt; <strong class='tag-b'>всегда</strong> (ну почти) неопределённое поведение&#33; Только static_cast&lt;&gt; или dynamic_cast&lt;&gt;. (const_cast&lt;&gt; вне контекста обсуждения.) Для указателей на методы в том числе, они не исключение.</li><li>Автор удивляется на касты по иерархиям с множественным наследованием. Тут надо признать, что проблема не так очевидна. Я просто оставлю тут вот это, где даже множественного наследования нет:<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">class A</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;virtual ~A(){} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// просто чтоб был полиморфным</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// метод определён</div><div class="code_line">class B: public A</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;virtual void foo() {}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// прямой вызов (попытка)</div><div class="code_line">void f(A&amp; a)</div><div class="code_line">{</div><div class="code_line">// &nbsp;a.foo(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// ожидаемо не скомпилится</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">// косвенный вызов (попытка)</div><div class="code_line">void g(A&amp; a, void (A::*ptr)())</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;(a.*ptr)(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // скомпилится</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;B b; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// метод есть!</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;g(b, &amp;B::foo); &nbsp; &nbsp; &nbsp;// не скомпилится, и правильно сделает</div><div class="code_line">&nbsp;&nbsp;g(b, static_cast&#60;void (A::*)()&#62;(&amp;B::foo)); &nbsp; &nbsp;// скомпилится, но ожидаемо упадёт в run-time, потому как для A в VMT ничего нет</div><div class="code_line">}</div></ol></div></div></div></div>Ну а чего вы ожидали от того, что невозможно чекнуть в run-time (правильно, предупреждения), особенно если всё-таки вбить этот код в компилер кувалдой. А теперь добавьте туда множественные базы. Не виртуальные и без dynamic_cast&lt;&gt;. Надеюсь, сегодня автор лучше разбирается в предмете. Вообще, всё, что он написал там и далее касательно опасностей суть просто нарушение ODR, только очень замаскированное. Статика же чекается однозначно ещё при компиляции: error.</li><li>На предмет рассмотрения хака из MFC могу сказать, что тогда их компилятор не умел то, что следовало бы уметь по Стандарту. Правда, использование MFC усложнилось бы, но без хака там всё реализуется. Я это делал в мультиметодах, прекрасно всё компилится и работает.</li></ul>По теории это всё. За практику ничего не буду.<br>
<br>
P.S. Большинство проблем с перекрёстным кастом указателей на методы снимается, если попросить компилятор всегда учитывать наихудшие случаи. Для MSVC это ключик /vmg. Тогда код в примере выше даже отработает правильно, ибо компилятор (наверное) нагенерит thunk к какому-нибудь аналогу &quot;pure virtual call&quot;, и пусть они даже не вызываются, достаточно, чтобы в VMT что-то было и корректно позднесвязалось. <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="2023-09-07T15:21:55+00:00">07.09.23, 15:21</time></span></span><br>
P.P.S. Статья реально очень старая. Уже 12 лет назад описанные в ней делегаты легко реализовывались биндами this в лямбды. В 2004-ом конечно всё было сложнее. И тем не менее даже тогда забиндить this в функциональный объект было несложно. Помню, как тут где-то в Холиварах писал подобное, только на предмет пропертей, а не делегатов.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894681</guid>
        <pubDate>Wed, 06 Sep 2023 21:00:45 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3894681</link>
        <description><![CDATA[gorbovsky: вот хорошая статья на тему.<br>
<a class='tag-url' href='https://www.rsdn.org/article/cpp/fastdelegate.xml' target='_blank'>https://www.rsdn.org/article/cpp/fastdelegate.xml</a><br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Теперь я, наверное, убедил вас в ужасности указателей на функции-члены. Но чем же они полезны? Пытаясь выяснить это, я провел большой поиск по коду, опубликованному в Интернете. И я нашел два общих случая использования указателей на функции-члены:<br>
<br>
надуманные примеры для демонстрации синтаксиса С++ новичкам;<br>
реализация делегатов&#33;</div></div>]]></description>
        <author>gorbovsky</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893979</guid>
        <pubDate>Mon, 14 Aug 2023 14:06:47 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893979</link>
        <description><![CDATA[Qraizer: Ну так если тебе нужно смещение, то offsetof() тебе и нужен. Указатели на элементы класса нужны как раз для того, чтобы не заморачиваться внутренней структурой класса и при этом чётко следить за типами.<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">/* linker script */</div><div class="code_line">mcu_mbar : origin = 0x80000000, length = 0x00008000</div><div class="code_line">MBAR = ADDR(mcu_mbar);</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">struct MemAddr</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;union</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int CS0STR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int CS0STP;</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int CS1STR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* ... */</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int CS7STP;</div><div class="code_line">&nbsp;&nbsp;};</div><div class="code_line">&nbsp;&nbsp;unsigned char dummy[0x100];</div><div class="code_line">};</div><div class="code_line">struct MemCntr</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;union</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int SDRAMMode;</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int SDRAMCtrl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int Config1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int Config2;</div><div class="code_line">&nbsp;&nbsp;};</div><div class="code_line">&nbsp;&nbsp;unsigned char dummy[0x100];</div><div class="code_line">};</div><div class="code_line">struct CDM</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;union</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int CDM_JTAG_ID;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* ... */</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned int CDM_PSC6CCR;</div><div class="code_line">&nbsp;&nbsp;};</div><div class="code_line">&nbsp;&nbsp;unsigned char dummy[0x100];</div><div class="code_line">};</div><div class="code_line">/* ... */</div><div class="code_line">struct RegSpace</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;MemAddr systemSpace;</div><div class="code_line">&nbsp;&nbsp;MemCntr SDRAM_control;</div><div class="code_line">&nbsp;&nbsp;CDM &nbsp; &nbsp; clockModule;</div><div class="code_line">&nbsp;&nbsp;/* ... */</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">extern unsigned char MBAR[];</div><div class="code_line">volatile RegSpace &amp;regMap = *reinterpret_cast&#60;RegSpace*&#62;(MBAR);</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="2023-08-14T14:50:26+00:00">14.08.23, 14:50</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">template &#60;typename CpuArea, typename RegType, typename T&#62;</div><div class="code_line">RegType out_reg(RegType CpuArea::* regPtr, T value, volatile CpuArea&amp; cpu)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return cpu.*regPtr = value;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename CpuArea, typename RegType&#62;</div><div class="code_line">RegType in_reg(RegType CpuArea::* regPtr, volatile CpuArea&amp; cpu)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return cpu.*regPtr;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename CpuArea, typename RegType&#62;</div><div class="code_line">RegType in_reg(RegType CpuArea::* regPtr, CpuArea RegSpace::* unit)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return regMap.*unit.*regPtr;</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">auto clck = &amp;RegSpace::clockModule;</div><div class="code_line">&nbsp;</div><div class="code_line">out_reg(&amp;CDM::CDM_PSC6CCR, 7, regMap.*clck);</div><div class="code_line">std::cout &#60;&#60; in_reg(&amp;MemCntr::Config1, &amp;RegSpace::SDRAM_control);</div></ol></div></div></div></div>Как по мне, красиво, но непонятно.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893943</guid>
        <pubDate>Sun, 13 Aug 2023 15:13:42 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893943</link>
        <description><![CDATA[Dushevny: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3893933'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-08-12T01:01:06+00:00">12.08.23, 01:01</time></span><div class='quote '>Но что-то мне подсказывает, что между экземплярами core и core::address_map не так всё просто.</div></div>core -это namespace. Экземпляра core::address_map тоже не существует, используется только смещение членов core::address_map от ее начала, это смещение и добывается при помощи offsetof(). <br>
<span class="b-attach" data-size="44929" data-hits="320" data-attach-id="65073" data-attach-post-id="3893943">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3893943&amp;attach_id=65073' title='Скачать файл' target='_blank'>Screenshot_from_2023_08_13_18_12_56.png</a> (, : 320)
		</span>]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893933</guid>
        <pubDate>Sat, 12 Aug 2023 01:01:06 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893933</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">uint8_t core::address_map::* ptr2ID = &amp;core::address_map::Product_ID;</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">core::address_map cpu;</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">cpu.*ptr2ID</div></ol></div></div></div></div><br>
Но что-то мне подсказывает, что между экземплярами core и core::address_map не так всё просто. <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="2023-08-12T01:03:59+00:00">12.08.23, 01:03</time></span></span><br>
И вообще, почему-то мне кажется, что cpu – это синглон, а в этом случае тебе не нужен ни указатель на поле структуры, ни offsetof(). Просто берёшь адрес поля экземпляра и получаешь обычный поинтер. <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="2023-08-12T01:09:26+00:00">12.08.23, 01:09</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">Transport.receive(&amp;cpu.Product_ID, Product_id);</div></ol></div></div></div></div>Понятно, что Transport.receive() требует определённых соглашений, которые мне неизвестны, но вопрос о синглоне, а значит и об отсутствии необходимости в параметризации имени поля структуры под указателем, это не отменяет, т.к. экземпляр класса сиречь this известен заранее.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893932</guid>
        <pubDate>Fri, 11 Aug 2023 21:27:37 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893932</link>
        <description><![CDATA[Dushevny: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3893930'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-08-11T20:37:20+00:00">11.08.23, 20:37</time></span><div class='quote '>Так а что из примера непонятно? </div></div>Как именно заменить им offsetof(). Я привел пример своего кода, где offsetof() используется для получения адреса регистра в адресном пространстве микросхемы. Код работает, но автодополнение эклипсы при написании этого кода работать отказывается. Как там можно заменить offsetof() на такой указатель?]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893930</guid>
        <pubDate>Fri, 11 Aug 2023 20:37:20 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893930</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3893890'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2023-08-11T07:51:47+00:00">11.08.23, 07:51</time></span><div class='quote '>Возможно, использование такого указателя поможет мне облагородить мой код.</div></div>Так а что из примера непонятно? Указатели хранят инфу об элементе класса, абстрагируясь от конкретного экземпляра. Сами по себе они никуда не указывают, и польза от них только при их применении к конкретному экземпляру. Даже разыменование такого указателя делается специальными операторами, содержащим конкретный this, а не обычной *, которая этого this предоставить не может. Разные экземпляры класса – разные результаты применения .* или -&gt;* к указателю. Конечно, такие указатели обязаны ещё корректно учитывать наследование.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3893890'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2023-08-11T07:51:47+00:00">11.08.23, 07:51</time></span><div class='quote '>Хм это уже вселяет пессимизм. С этими указателями вообще возможно сделать хоть что-то, кроме присваивания и разыменования?</div></div>Ещё сравнения. А к чему там адресная арифметика? Что, хотя бы теоретически, могло бы быть результатом ++ к указателю? Обычно указатели на элементы классов используются тогда же, когда и обычные указатели: когда нет возможности или желания жёстко задавать имя подуказываемого объекта. Но обычные объекты могут быть объединены в массивы, а как быть с указателями на поля? К слову, над указателями на функции тоже нет адресной арифметики. Почему? За ненадобностью.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893890</guid>
        <pubDate>Fri, 11 Aug 2023 07:51:47 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893890</link>
        <description><![CDATA[Dushevny: Интересная конструкция, тоже никогда не встречал ее упоминаине<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3893883'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-08-11T01:39:47+00:00">11.08.23, 01:39</time></span><div class='quote '>В целом указатели на данные класса просто замещают тобой макрос offsetof() из C, при этом делая операции типобезопасными и более удобными. </div></div><br>
Где про это можно почитать? У меня есть код с offsetof и этот код мне не нравится:<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</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">&nbsp;&nbsp; &nbsp;struct address_map</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;data &nbsp; &nbsp; &nbsp; &nbsp;Data;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;uint8_t &nbsp; &nbsp; Temperature; &nbsp; &nbsp; &nbsp; &nbsp;// -75...125 deg.C, ~0.8 deg.C/LSB</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;uint8_t &nbsp; &nbsp; TU &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: &nbsp;2; &nbsp; // time unit of the synchronization events. Only 2 bits are used,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// and the corresponding time units are 2^(-11), 2^(-12), 2^(-13),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// and 2^(-14) of the TPH, respectively, for the TU value of 00, 01, 10, and 11.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Alternatively, this byte can be defined by I3C CCC command, with the defining</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// byte of 0x9F, followed by one byte of data.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;uint8_t &nbsp; &nbsp; reserved1[11];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;status &nbsp; &nbsp; &nbsp;Status;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;uint8_t &nbsp; &nbsp; ODR; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// This byte defines the frequency of the continuous-mode measurements. ODR can</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// be defined by either writing the number into this register, or using SETXTIME</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// CCC command, followed by defining byte of 0x8F. In order to enter the continuous</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// mode, this byte should not be zero. The configurable ODR is 1 to 255, with</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// increment of 1. The 1000 Hz ODR is available by writing 255 into this byte and</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// setting hpower to 1</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;struct control</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;core::control::reg0 &nbsp; &nbsp; Reg0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;core::control::reg1 &nbsp; &nbsp; Reg1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;core::control::reg2 &nbsp; &nbsp; Reg2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Control;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;uint8_t &nbsp; &nbsp; Selftest_threshold[MAX_AXIS];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;uint8_t &nbsp; &nbsp; reserved2[6];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;uint8_t &nbsp; &nbsp; Selftest_set_signal[MAX_AXIS];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;uint8_t &nbsp; &nbsp; reserved3[15];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;uint8_t &nbsp; &nbsp; Product_ID;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} __attribute__((__packed__));</div><div class="code_line">...</div><div class="code_line">#include &nbsp; &nbsp;&#60;stddef.h&#62; &nbsp;// offsetof()</div><div class="code_line">#define REG_OFFSET(reg) &nbsp; &nbsp;offsetof(core::address_map, reg)</div><div class="code_line">&nbsp;</div><div class="code_line">bool chip::detect()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;using namespace core;</div><div class="code_line">&nbsp;&nbsp; &nbsp;using namespace control;</div><div class="code_line">&nbsp;&nbsp; &nbsp;debug_header(&quot;Product ID read&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint8_t Product_id;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(!Transport.receive(Bus_address, REG_OFFSET(Product_ID), Product_id))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return disconnected();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(Product_id != core::PRODUCT_ID)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return failed();</div><div class="code_line">&nbsp;&nbsp; &nbsp;State = OK;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return debug_ok();</div><div class="code_line">}</div></ol></div></div></div></div></div></div><br>
Возможно, использование такого указателя поможет мне облагородить мой код.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=437120&view=findpost&p=3893883'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-08-11T01:39:47+00:00">11.08.23, 01:39</time></span><div class='quote '>P.S. И да, они не указатели в том смысле, что не совместимы с простыми указателями на данные или функции. Даже с void*.</div></div>Хм это уже вселяет пессимизм. С этими указателями вообще возможно сделать хоть что-то, кроме присваивания и разыменования?]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893883</guid>
        <pubDate>Fri, 11 Aug 2023 01:39:47 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893883</link>
        <description><![CDATA[Qraizer: Указатель на элемент класса S типа int. <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="2023-08-11T01:41:49+00:00">11.08.23, 01:41</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">f = &amp;S::data;</div><div class="code_line">&nbsp;</div><div class="code_line">S x, y, *z = new S;</div><div class="code_line">/* ... */</div><div class="code_line">&nbsp;</div><div class="code_line">x.*f = y.*f + z-&#62;*f;</div><div class="code_line">&nbsp;</div><div class="code_line">/* ... */</div><div class="code_line">delete z;</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="2023-08-11T01:44:42+00:00">11.08.23, 01:44</time></span></span><br>
В целом указатели на данные класса просто замещают тобой макрос offsetof() из C, при этом делая операции типобезопасными и более удобными. Но чаще встречаются указатели на методы класса, и они куда более мощная штука. Особенно если вспомнить, что методы бывают виртуальными, а классы виртуально наследуемыми.<br>
<br>
P.S. И да, они не указатели в том смысле, что не совместимы с простыми указателями на данные или функции. Даже с void*. И даже с указателями на такие же элементы другого класса, если только эти классы не связаны единой иерархией наследования. И над ними нет адресной арифметики. И sizeof() от них бывает довольно странный.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893881</guid>
        <pubDate>Thu, 10 Aug 2023 22:22:02 +0000</pubDate>
        <title>type ::*</title>
        <link>https://forum.sources.ru/index.php?showtopic=437120&amp;view=findpost&amp;p=3893881</link>
        <description><![CDATA[gorbovsky: Добрый день.<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">struct S</div><div class="code_line">{</div><div class="code_line">int data;</div><div class="code_line">S():data(33){}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;int S::* f; &nbsp;// ??????</div></ol></div></div></div></div><br>
поисковики выпинывают на указатели, но f не указатель. что это?]]></description>
        <author>gorbovsky</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	