<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/'>
<channel>
  <title>C++ User Journal - Ukraine</title>
  <link>http://community.livejournal.com/cujua/</link>
  <description>C++ User Journal - Ukraine - LiveJournal.com</description>
  <lastBuildDate>Tue, 10 Apr 2007 14:57:51 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>cujua</lj:journal>
  <lj:journaltype>community</lj:journaltype>
<item>
  <guid isPermaLink='true'>http://community.livejournal.com/cujua/1048.html</guid>
  <pubDate>Tue, 10 Apr 2007 14:57:51 GMT</pubDate>
  <title>Конечный автомат</title>
  <link>http://community.livejournal.com/cujua/1048.html</link>
  <description>&lt;a href=&quot;http://www.rsdn.ru/article/alg/Static_Finite_State_Machine.xml&quot;&gt;Конечный автомат и его генерация средствами Си++ компилятора на основе шаблонов, без полиморфизма&lt;/a&gt;. Рекомендую всем.&lt;br /&gt;&lt;br /&gt;P.S.: Статья дает краткое описание идеи реализации конечного автомата на шаблонах. Есть простой пример на Си++, на основе которого, приложившись, можно сделать довольно сложную и в то же время очень удобную машину состояний.</description>
  <comments>http://community.livejournal.com/cujua/1048.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>jetsnail</lj:poster>
</item>
<item>
  <guid isPermaLink='true'>http://community.livejournal.com/cujua/776.html</guid>
  <pubDate>Fri, 06 Apr 2007 17:25:45 GMT</pubDate>
  <title>Сведи компилятор с ума!</title>
  <link>http://community.livejournal.com/cujua/776.html</link>
  <description>Сегодня вечером нечего было делать, вот я и решил свести свой компилятор с ума. Я думаю, что каждый из вас работал со списками типов, но никто не делал вот так:&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#000080&quot;&gt;struct A {&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template&amp;lt;typename TList&amp;gt;&lt;br /&gt;struct MultipleInheritance :&lt;br /&gt;&amp;nbsp; public TList::Head,&lt;br /&gt;&amp;nbsp; public MultipleInheritance&amp;lt;typename TList::Tail&amp;gt;&lt;br /&gt;{&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename T1&amp;gt;&lt;br /&gt;struct RecTList {&lt;br /&gt;&amp;nbsp; typedef T1 Head;&lt;br /&gt;&amp;nbsp; typedef RecTList&amp;lt; RecTList&amp;lt;T1&amp;gt; &amp;gt; Tail;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;typedef RecTList&amp;lt;A&amp;gt; ARecTList;&lt;br /&gt;&lt;br /&gt;class RectClass : public MultipleInheritance&amp;lt;ARecTList&amp;gt; {};&lt;br /&gt;&lt;br /&gt;int main() {&lt;br /&gt;&amp;nbsp; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;gcc долго-долго думает, потом корректно обрабатывает эту ситуацию, если NN значение параметра &lt;font color=&quot;#000080&quot;&gt;-ftemplate-depth-NN&lt;/font&gt; не слишком большое, но если, к примеру, его увеличить, то получим&amp;nbsp; нехватку памяти (памяти у меня много, так что ждать я не стал, кому интересно - попробуйте свалить gcc в core, поделитесь результатами).&lt;br /&gt;&lt;br /&gt;А вот Microsoft Visual Studio 2005 SP1 просто сходит с ума:&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#000080&quot;&gt;1&amp;gt;------ Build started: Project: crec, Configuration: Debug Win32 ------&lt;br /&gt;1&amp;gt;Compiling...&lt;br /&gt;1&amp;gt;main.cpp&lt;br /&gt;1&amp;gt;x:\temp\crec\main.cpp(6) : fatal error C1001: An internal error has occurred in the compiler.&lt;br /&gt;1&amp;gt;(compiler file &apos;msc1.cpp&apos;, line 1393)&lt;br /&gt;1&amp;gt; To work around this problem, try simplifying or changing the program near the locations listed above.&lt;br /&gt;1&amp;gt;Please choose the Technical Support command on the Visual C++ &lt;br /&gt;1&amp;gt; Help menu, or open the Technical Support help file for more information&lt;br /&gt;1&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x:\temp\crec\main.cpp(9) : see reference to class template instantiation &apos;MultipleInheritance&amp;lt;TList&amp;gt;&apos; being compiled&lt;br /&gt;1&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x:\temp\crec\main.cpp(9) : see reference to class template instantiation &apos;MultipleInheritance&amp;lt;RecTList&amp;lt;T1&amp;gt;&amp;gt;&apos; being compiled&lt;br /&gt;1&amp;gt;Build log was saved at &quot;file://x:\Temp\crec\Debug\BuildLog.htm&quot;&lt;br /&gt;1&amp;gt;crec - 1 error(s), 0 warning(s)&lt;br /&gt;========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;Будьте осторожнее.</description>
  <comments>http://community.livejournal.com/cujua/776.html</comments>
  <category>recursion</category>
  <category>c++</category>
  <category>template</category>
  <category>type list</category>
  <category>compile-time</category>
  <lj:security>public</lj:security>
  <lj:poster>jetsnail</lj:poster>
</item>
<item>
  <guid isPermaLink='true'>http://community.livejournal.com/cujua/745.html</guid>
  <pubDate>Thu, 13 Apr 2006 16:41:09 GMT</pubDate>
  <title>Как подружиться с шаблонными параметрами</title>
  <link>http://community.livejournal.com/cujua/745.html</link>
  <description>&lt;br /&gt;Мэтью Уилсон (Matthew Wilson) в своей статье “Дружественные Шаблоны” (Friendly Templates) которую вы можете найти в оригинале по адресу &lt;a href=&quot;http://www.cuj.com/documents/s=8943/cujexp0312wilson2/&quot;&gt;http://www.cuj.com/documents/s=8943/cujexp0312wilson2/&lt;/a&gt; рассказал о том, как использовать шаблонные параметры в объявлении друзей классов. Его статья послужила толчком для некоторых интересных C++ решений. Ниже представлен перевод статьи Мэтью (немного лишней информации я убрал, однако важная информация от начала и до конца представлена в полном объеме) и мои исправления/дополнения.&lt;br /&gt;&lt;br /&gt;
&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;&lt;strong&gt;Статья Мэтью Уилсона.&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Иногда возникают ситуации, когда необходимо объявить друга класса, однако его тип представлен в виде шаблонного параметра. Например:&lt;br /&gt;&lt;br /&gt;// Пример #1&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;class Thing&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; friend T; // Разрешает классу T доступ ко всем данным и методам данного класса.&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp; int value_;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Выглядит вполне разумно, не так ли? Но это не стандартный C++. В стандарте языка C++ (документ C++-98 Standard (ISO/IEC 14882)), пункт 7.1.5.3(2) сказано, что внутри шаблонного класса с параметром типа T конструкция вида “friend class T;” запрещена (&lt;a href=&quot;http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf&quot;&gt;http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Но я прагматист, а не правовед языка. То, что я хочу сделать – вполне логично, как минимум в тех местах кода, где это просто необходимо, поэтому я заинтересован в таком решении, пусть оно и нестандартно.&lt;br /&gt;&lt;br /&gt;Пример #1, приведенный выше, обрабатывается такими компиляторами как: Borland (5.51 and 5.6), Comeau (4.3.0.1), Digital Mars (GCC (2.95), Intel (6 and 7), Watcom (11 and 12), and Visual C++ (4.2 through 7.1). Однако он не работает с CodeWarrior (7 and 8) или GCC (3.2). С компилятором Comeau код работает в стандартной конфигурации, если же указать флаг “—strict”, то компилятор начнет “ругаться”, что конструкция и все ее возможные формы не являются стандартными.&lt;br /&gt;&lt;br /&gt;Шаблонный параметр, по сути, может быть простым типом (POD type), а не классом, например типом “int”. Для некоторых компиляторов - это проблема. Такие типы не могут быть друзьями, поэтому стоит указать, что тип, переданный в качестве шаблонного параметра – это класс. Например:&lt;br /&gt;&lt;br /&gt;// Пример #2&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;class Thing&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; friend class T; // Разрешает классу T доступ ко всем данным и методам данного класса.&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp; int value_;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Этот пример работает без проблем с CodeWarrior, Digital Mars и Watcom компиляторами. Таким образом первый либо второй пример нам подходит в том или ином случае. Однако проблемы до сих пор остаются для компилятора GCC версии 3.2.&lt;br /&gt;&lt;br /&gt;Будучи тем, кто сторонится использования “друзей”, я не смог придумать решение этой проблемы и проконсультировался с ребятами из группы comp.lang.c++.moderated (&lt;a href=&quot;http://www.google.com/groups?hl=en&amp;amp;lr=&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8&amp;amp;newwindow=1&amp;amp;threadm=5d33192c.0310010048.44c06c13@posting.google.com&amp;amp;rnum=1&amp;amp;prev=&quot;&gt;http://www.google.com/groups?hl=en&amp;amp;lr=&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8&amp;amp;newwindow=1&amp;amp;threadm=5d33192c.0310010048.44c06c13@posting.google.com&amp;amp;rnum=1&amp;amp;prev=&lt;/a&gt;), которые посоветовали два следующих примера:&lt;br /&gt;&lt;br /&gt;// Пример #3&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;class Thing&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; struct friend_maker&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; typedef T T2;&lt;br /&gt;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&amp;nbsp; typedef typename friend_maker::T2 friend_type;&lt;br /&gt;&amp;nbsp; friend class friend_type;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp; int value_;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Пример #4&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;class Thing&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; template&amp;lt;class T2&amp;gt;&lt;br /&gt;&amp;nbsp; struct friend_maker&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; typedef T2 T3;&lt;br /&gt;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&amp;nbsp; typedef typename friend_maker&amp;lt;T&amp;gt;::T3 friend_type;&lt;br /&gt;&amp;nbsp; friend class friend_type;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp; int value_;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Таким образом, мы нашли решения, с помощью которых можно использовать шаблонные параметры в качестве друзей класса для всех современных компиляторов. Осталось только привести это к более-менее удобному виду. Ниже приведен код с использованием препроцессора для корректного объявления конструкции в зависимости от компилятора.&lt;br /&gt;&lt;br /&gt;// Пример #5&lt;br /&gt;#if defined(__BORLANDC__) || \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(__COMO__) || \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(__DMC__) || \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;nbsp;&amp;nbsp; defined(__GNUC__) &amp;amp;&amp;amp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __GNUC__ &amp;lt; 3) || \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(__INTEL_COMPILER) || \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(__WATCOMC__) || \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(_MSC_VER)&lt;br /&gt;# define&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE_TEMPLATE_PARAM_AS_FRIEND(T)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; friend T&lt;br /&gt;#elif defined(__MWERKS__)&lt;br /&gt;# define&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE_TEMPLATE_PARAM_AS_FRIEND(T)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; friend class T&lt;br /&gt;#elif defined(__GNUC__) &amp;amp;&amp;amp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __GNUC__ &amp;gt;= 3&lt;br /&gt;# define&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE_TEMPLATE_PARAM_AS_FRIEND(T)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct friend_maker&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typedef T T2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; typedef typename friend_maker::T2 friend_type;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; friend friend_type&lt;br /&gt;#else&lt;br /&gt;// Мы не знаем, какой компилятор используется,&lt;br /&gt;// возможно следует сгенерировать ошибку, однако будем надеяться,&lt;br /&gt;// что он поддерживает такую конструкцию:&lt;br /&gt;# define&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE_TEMPLATE_PARAM_AS_FRIEND(T)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; friend T&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;Теперь мы очень просто можем использовать такой код:&lt;br /&gt;&lt;br /&gt;// Пример #6&lt;br /&gt;template &amp;lt;typename T&amp;gt;&lt;br /&gt;class Thing&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; DECLARE_TEMPLATE_PARAM_AS_FRIEND(T);&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp; int value_;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Список компиляторов и данные о том, какую форму шаблонных друзей они поддерживают можно посмотреть в оригинальной статье.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Мои исправления и дополнения&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Что произойдет, если нам будет необходимо объявить больше одного “друга”? Например вот так:&lt;br /&gt;&lt;br /&gt;// Пример #7&lt;br /&gt;template &amp;lt;typename T1, typename T2&amp;gt;&lt;br /&gt;class Thing&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; DECLARE_TEMPLATE_PARAM_AS_FRIEND(T1);&lt;br /&gt;&amp;nbsp; DECLARE_TEMPLATE_PARAM_AS_FRIEND(T2);&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp; int value_;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Макрос “DECLARE_TEMPLATE_PARAM_AS_FRIEND” локально объявляет структуру “friend_maker”. В данном случае она будет сгенерирована два раза, но имена отличаться не будут, что приведет к ошибке.&lt;br /&gt;&lt;br /&gt;Чтобы избежать такого конфуза я немного переделал макрос для того, чтобы имена структуры были уникальными в зависимости от имени типа “друга”.&lt;br /&gt;&lt;br /&gt;// Пример #8&lt;br /&gt;# define&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE_TEMPLATE_PARAM_AS_FRIEND(T)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; struct make_friend_##T&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; typedef T T2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; };&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; typedef typename make_friend_##T::T2 friend_type_##T;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; friend friend_type_##T&lt;br /&gt;&lt;br /&gt;Вот и все, теперь можно использовать это решение в своих проектах.&lt;br /&gt;Например, я сделал версию макроса для проекта Boost.&lt;br /&gt;&lt;br /&gt;#ifndef BOOST_TEMPLATE_FRIEND_HPP&lt;br /&gt;#define BOOST_TEMPLATE_FRIEND_HPP&lt;br /&gt;&lt;br /&gt;#include &amp;lt;boost/config.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/detail/workaround.hpp&amp;gt;&lt;br /&gt;&lt;br /&gt;#if defined(BOOST_MSVC) &amp;amp;&amp;amp; BOOST_WORKAROUND(BOOST_MSVC, &amp;gt;= 1020)&lt;br /&gt;# pragma once&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#if (defined(__GNUC__) &amp;amp;&amp;amp; BOOST_WORKAROUND(__GNUC__, &amp;lt; 3)) || \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(__BORLANDC__) ||&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(__COMO__) ||&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(__DMC__) ||&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(__WATCOMC__) ||&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(BOOST_MSVC)&amp;nbsp; ||&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defined(BOOST_INTEL)&lt;br /&gt;# define BOOST_DECLARE_TEMPLATE_FRIEND(T) friend T&lt;br /&gt;#elif defined(__MWERKS__)&lt;br /&gt;# define BOOST_DECLARE_TEMPLATE_FRIEND(T) friend class T&lt;br /&gt;#elif defined(__GNUC__) &amp;amp;&amp;amp; BOOST_WORKAROUND(__GNUC__, &amp;gt;= 3)&lt;br /&gt;# define BOOST_DECLARE_TEMPLATE_FRIEND(T)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; struct make_friend_##T&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; typedef T T2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; };&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; typedef typename make_friend_##T::T2 friend_type_##T;&amp;nbsp;&amp;nbsp; \&lt;br /&gt;&amp;nbsp; friend friend_type_##T&lt;br /&gt;#else&lt;br /&gt;# define BOOST_DECLARE_TEMPLATE_FRIEND(T) friend T&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#endif&amp;nbsp; // BOOST_TEMPLATE_FRIEND_HPP&lt;/div&gt;
&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;</description>
  <comments>http://community.livejournal.com/cujua/745.html</comments>
  <category>friend</category>
  <category>c++</category>
  <category>template</category>
  <category>compile-time</category>
  <lj:security>public</lj:security>
  <lj:poster>jetsnail</lj:poster>
</item>
<item>
  <guid isPermaLink='true'>http://community.livejournal.com/cujua/327.html</guid>
  <pubDate>Wed, 12 Apr 2006 20:02:16 GMT</pubDate>
  <title>Добро пожаловать!</title>
  <link>http://community.livejournal.com/cujua/327.html</link>
  <description>Добрый день, уважаемые друзья. Рад приветствовать Вас в сообществе C++ разработчиков. Это сообщество создано для тех, кто заинтересован в интересных и качественных решениях проблем с помощью языка C++.   &lt;br /&gt;&lt;br /&gt;Хочется заметить, что здесь Вы не найдете уроков для новичков или глупых вопросов по программированию, для этого существует много других сообществ, групп и форумов. Особый упор хочется сделать на профессиональные, сложные или нестандартные решения относительно языка и связанных с ним средств разработки. Структура информации организована в виде статей с их дальнейшим обсуждением. Основной язык, на котором будет изложен материал – русский, так же приветствуются статьи и на украинском языке.&lt;br /&gt;&lt;br /&gt;Я искренне надеюсь на Вашу помощь. Приглашаю к сотрудничеству заинтересованных профессионалов своего дела. Если у Вас есть знания и опыт, которыми Вы хотите поделиться с миром, помочь новичкам и, быть может, усовершенствовать свои решения с помощью профессиональной и объективной критики – добро пожаловать.   Как известно, начинать всегда очень сложно, я попытаюсь сделать все от меня зависящее, чтобы качество информации было на высоте, чем собственно и хочу привлечь внимание профессионалов и интересующихся. Уверен, что этот журна C++ программистов будет полезен сообществу. Так же я буду переводить статьи с английского языка. Я понимаю, что английский язык очень важен и маловероятно то, что профессиональный разработчик его не знает, но все же родной язык воспринимается человеком легче и быстрее.&lt;br /&gt;&lt;br /&gt;Если у Вас есть какие-то вопросы, замечания или предложения – пишите мне, с удовольствием отвечу каждому.&lt;br /&gt;&lt;br /&gt;С уважением,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Владислав Лазаренко.</description>
  <comments>http://community.livejournal.com/cujua/327.html</comments>
  <lj:security>public</lj:security>
  <lj:poster>jetsnail</lj:poster>
</item>
</channel>
</rss>
