Aka Tuple
От: Alexey Chen Чили  
Дата: 21.06.05 14:37
Оценка: 149 (15)
Заглянул тут в книжку Вандервурда. Там в главе про Tupple, штука такая есть — val<n>. Удобно конечно, но у меня возникла идея, возможно старая как мир. Но таки приведу её на правах прикола.


#include <string>
#include <iostream>

enum _n_Height  { n_Height };
enum _n_Weight  { n_Weight };
enum _n_Name    { n_Name };

struct Fake_Struct { void operator []( Fake_Struct const& ); };

template < class _Tx, class _Name, class _Super = Fake_Struct >
  struct Struct : _Super
    {
      using _Super::operator[];

      _Tx val_;
      _Tx& operator []( _Name n ) { return val_; }

      Struct() : val_(_Tx()) {}
    };

typedef 
  Struct< int, _n_Height, Struct < float, _n_Weight, Struct < std::string, _n_Name > > >
  MyStruct;


int main()
  {

    MyStruct s;

    s[n_Height]  = 10;
    s[n_Weight]  = 20.3;
    s[n_Name]    = "name";

    std::cout
      << s[n_Height]  << std::endl
      << s[n_Weight]  << std::endl
      << s[n_Name]    << std::endl
      ;

    return 0;

  }


PS:
Выкриков — 'баян' и тухлых помидоров я не боюсь, ибо действительно прикольно.
Re: Aka Tuple
От: MaximE Великобритания  
Дата: 26.06.05 16:31
Оценка: 9 (1) +5 -2
On Tue, 21 Jun 2005 18:37:02 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:

> Заглянул тут в книжку Вандервурда. Там в главе про Tupple, штука такая есть — val<n>. Удобно конечно, но у меня возникла идея, возможно старая как мир. Но таки приведу её на правах прикола.

>
>
>
> #include <string>
> #include <iostream>
>
> enum _n_Height  { n_Height };
> enum _n_Weight  { n_Weight };
> enum _n_Name    { n_Name };
>
> struct Fake_Struct { void operator []( Fake_Struct const& ); };
>
> template < class _Tx, class _Name, class _Super = Fake_Struct >
>   struct Struct : _Super
>     {
>       using _Super::operator[];
>
>       _Tx val_;
>       _Tx& operator []( _Name n ) { return val_; }
>
>       Struct() : val_(_Tx()) {}
>     };
>
> typedef
>   Struct< int, _n_Height, Struct < float, _n_Weight, Struct < std::string, _n_Name > > >
>   MyStruct;
>
>
> int main()
>   {
>
>     MyStruct s;
>
>     s[n_Height]  = 10;
>     s[n_Weight]  = 20.3;
>     s[n_Name]    = "name";
>
>     std::cout
>       << s[n_Height]  << std::endl
>       << s[n_Weight]  << std::endl
>       << s[n_Name]    << std::endl
>       ;
>
>     return 0;
>
>   }
>

>
> PS:
> Выкриков — 'баян' и тухлых помидоров я не боюсь, ибо действительно прикольно.

Возможно это "действительно прикольно", но абсолютно бесполезно.

Проблем с этим tuple'ом две:
  1. Сам факт, что до объявления кортежа нужно объявить имена его членов, а при объявлении объявить имена и их типы убивают всю идею на корню. Я не вижу, чем приведенный выше кортеж лучше, чем обычное
    struct my_struct
    {
         int height;
         float weight;
         std::string name;
    };

    Я вижу лишь что на описание этой же структуры в оригинальном коде ушло больше писанины без какой либо пользы.
  2. Практическая применимость такого кортежа в шаблонном коде близка к абсолютному нулю. Ничего не стоит в compile time определить количество членов boost::tuple и проитерироваться по его членам, так как индексом его членов является целое, результаты арифметических операций над которым вычисляются в compile time. По приведенному кортежу невозможно проитерироваться в generic коде, так как нужно знать имена членов. Возвращемся к тому, что индексы должны быть простыми целыми.
    С другой стороны целочисленные индексы не убивают возможности использовать осмысленные имена. boost::tuple:
    typedef tuple<int, float, std::string> my_struct;
    enum { height, weight, name };
    // ...
    my_struct s;
    get<height>(s) = 1;

    Я не вижу недостатка в том, что вместо operator[] для доступа к членам используется get<>(), так как реально никакого практического смыла в operator[] нет из-за того, что он не может использоваться в generic коде который ожидает семантику operator[] как у встроенных типов.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[8]: Aka Tuple
От: korzhik Россия  
Дата: 27.06.05 10:31
Оценка: 1 (1) +2 :))
Здравствуйте, Pavel Chikulaev, Вы писали:

PC>У тебя прям какая-то бусто фобия


А у тебя прям бусто мания! Честное слово!
Re: Aka Tuple
От: Alexey Chen Чили  
Дата: 25.06.05 17:21
Оценка: 54 (4)
Здравствуйте, Alexey Chen, Вы писали:

AC>Заглянул тут в книжку Вандервурда. Там в главе про Tuple, штука такая есть — val<n>. Удобно конечно, но у меня возникла идея, возможно старая как мир. Но таки приведу её на правах прикола.


Я так понял, идея понравилась.

Тогда расскажу продолжение истории...

Кода я попробывал скомпилировать пример в шестой студии, получил весьма неприятное сообщение. Дескать, опреатор [] уже определён. Так пришлось отказатьса от using'а.

Но как же разрешить такую проблему, спросил я себя: Использовать опреаторы базовых шаблонных классов я не могу ибо компилятор их не видит, использовать явное указание компилятору я тоже не могу, он этого не понимает.

Однако, надо писать шаблонный оператор. Оператор, который будет в зависимости от ключа возвращать значение из нужной базы. Ну вы уже понимаете на какую фичу C++ я наткнулся? Правильно, у любой функции обязятельно должн быть задан тип для возвращаемого значения. Автоопределения типа по выраженияю в С++ нет.

Ну что же, значит надо определять тип по ключу. Реально это не сложно, просто рекурсивный шаблон. Но тут шестая студия подставила мне очередную подножку. Ага, она не может вычислять тип возвращаемого значения. Параметр шаблона там стоять может, но элемент другого шаблона параметризированный параметром — нет.

Вот теперь мне стало действительно весело. Нужно было кардинально другое решение, и я его таки родил.

int main()
  {
    Scord< _sf_iHeight, Scord<_sf_fWeight, Scord<_sf_szName> > > s;

    sf_iHeight[s] = 10;
    sf_fWeight[s] = 20.3;
    sf_szName[s] = "jony";

    std::cout
      << sf_iHeight[s]  << std::endl
      << sf_fWeight[s]  << std::endl
      << sf_szName[s]   << std::endl
      << std::endl
      ;
 
    return 0;
  }


Идея вобщем-то простая — пеменять ключ и контейнер местами. Но таки _идея_! Возможно кому-то она поможет выкрабкаться из более тяжёлой ситуации. Чем то это похоже на функции селекторы, но принципиальное отличие в структуре, кторую можно рефлексировать.

Собственно реализация для тех кому интересно. ИМХО, имеет чисто академический интерес.
#define TEGGO_SFIELD(name,type) \
  struct _sf_##name : Sfield< type, _sf_##name > {}; \
  /*static*/ _sf_##name const sf_##name = _sf_##name()

template < class _Key >
  struct _Scord_Value
    {
      typename _Key::_Type sf_value_;
      _Scord_Value() : sf_value_(typename _Key::_Type()) {}
    };

template < class _Tp, class _Self >
  struct Sfield
    {
      typedef _Tp _Type;
      template < class _Value >
        _Type& operator[](_Value &val) const
        {
          return static_cast<_Scord_Value<_Self>&>(val).sf_value_;
        };
    };

struct _Scord_Fake {};

template < class _Key, class _Lst = _Scord_Fake >
  struct Scord : _Scord_Value<_Key>, _Lst 
    {
    };

TEGGO_SFIELD(iHeight, int);
TEGGO_SFIELD(fWeight, float);
TEGGO_SFIELD(szName,  std::string);
Re[4]: Aka Tuple
От: Alexey Chen Чили  
Дата: 26.06.05 20:04
Оценка: +1 :))
Здравствуйте, MaximE, Вы писали:

ME>On Sun, 26 Jun 2005 21:19:54 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:


>> Не буду спорить.

ME>Спорить нам не нужно. Приведи конкретные преимущества твоей идеи на конкретном реальном примере.

Простите, приемущества перед чем? Я где-то написал что вот дескать придумал нечто супер крутое, которое порвет (ну например) boost как тузик грелку? Может я сказал что написал мега tuple и всем три раза сказать ку? Я поделился идей, почему я ещё должен кому-то доказывать, что эта стоящая идея?! НЕ БУДУ этого делать! В принципе.

Не понял ты зачем это надо, ну дык, а я то тут при чём?
Я уже привёл пример задачи вашему единомышленнику, повторяться не буду.

AC> Просто спрошу: что если я решал другую задачу, о которой Вы даже не подумали? Что если 'обобщённый код' не всегда совпадает с Modern C++ и метопрограммирование? Возможно есть и другие способы написания программ кроме как boost::... Наверное, но науке это, как водится, не известно.

ME>Нам, простым смертным кодерам, не терпится достигнуть просветления и узнать ту высокую задачу, которую хранит твое чело. (прости, — не совершенен, не удержался )
А я и не сомневался

*в сторону* нда, я на личности не переходил.

Может повесим на входе табличку:


Каждый желающий запостить идею или пример кода должен приложить подробно разжёванное описание (понятное для кофейников), а так же примеры на которых доступно показано чем его идея лучше чем boost. Примеры должны быть написаны в терминах буста с использованием буста и на задачах решаемых бустом. Отсутствие буста в примерах и идее, а так же непонимание почитателями буста, почему таковое кому либо может быть интересно, карается всеобщем порицанием и удалением.


А? Как тебе такая идея? Тогда я точно постить ничего не буду. И тебе будет сухо и комфортно.
(Особенно в духе идей об общем уровне форума)

Можно ещё переименовать форум из C++ в BOOST++, тогда наверное наступит всеобщее счастье и просветление.
Re[4]: Aka Tuple
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 27.06.05 04:25
Оценка: +3
Здравствуйте, MaximE, Вы писали:

ME>On Sun, 26 Jun 2005 21:19:54 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:


ME>[]


>> Не буду спорить.


ME>Спорить нам не нужно. Приведи конкретные преимущества твоей идеи на конкретном реальном примере.


Извините, коллеги, что вмешиваюсь в ваш холивар, но мне показалось (на первый взгляд, я не проверял на компиляторе), что в решении Alexey Chen
Автор: Alexey Chen
Дата: 21.06.05
можно использовать не последовательно идущие значения enum-a. Например:
enum stop_t  { cmd_stop = 0x1001 };
enum start_t { cmd_start = 0x2000 };
enum pause_t { cmd_pause = 0x40000 };

(такие значения могут потребоваться, например, для управления каким-то внешним устройством).

В то время как в boost::tuple необходимо использовать значения от 0 до k-1:

get<N>(t)

where t is a tuple object and N is a constant integral expression specifying the index of the element to be accessed. Depending on whether t is const or not, get returns the Nth element as a reference to const or non-const type. The index of the first element is 0 and thus N must be between 0 and k-1, where k is the number of elements in the tuple. Violations of these constrains are detected at compile time.




А вообще, по количеству упоминаний boost-а в данном форуме, слова Алексея (Re[4]: Aka Tuple
Автор: Alexey Chen
Дата: 27.06.05
):

Каждый желающий запостить идею или пример кода должен приложить подробно разжёванное описание (понятное для кофейников), а так же примеры на которых доступно показано чем его идея лучше чем boost. Примеры должны быть написаны в терминах буста с использованием буста и на задачах решаемых бустом. Отсутствие буста в примерах и идее, а так же непонимание почитателями буста, почему таковое кому либо может быть интересно, карается всеобщем порицанием и удалением.

Оказываются довольно актуальными
Все же boost пока не стандарт, не везде работает, да и могут быть административно/политические причины не использовать boost. Поэтому я не думаю, что нужно обязательно при публикации какой-то идеи проводить ее сравние с boost-ом. А то это начинает напоминать проверки на соответствие "генеральной линии партии и коммунистической идеологии" в недавние времена
... << RSDN@Home 1.1.4 beta 7 rev. 447>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[10]: Aka Tuple
От: jazzer Россия Skype: enerjazzer
Дата: 28.06.05 19:52
Оценка: 14 (1) :)
Здравствуйте, Pavel Chikulaev, Вы писали:

PC>Здравствуйте, korzhik, Вы писали:


K>>Здравствуйте, Pavel Chikulaev, Вы писали:


PC>>>У тебя прям какая-то бусто фобия :)))


K>>А у тебя прям бусто мания! Честное слово! :)

PC>1. На моей платформе и компиляторе буст замечательно работает (VC7.1). От чего ж мне его не использовать?

Это ты, батенька, закушался просто :)
Вот воинственный Алексей сидит на безнадежном сановском компилере, посмотри при случае regression буста на нем.
И я на том же долбаном сане сижу, уже упарился на баги этого убогого компилятора натыкаться, а ведь совершенно на ровном месте баги вылезают :(

Так что, мы, конечно, рады за тебя, но нам ничего из буста, кроме препроцессора, не светит :(
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Aka Tuple
От: uw  
Дата: 27.06.05 07:22
Оценка: 10 (2)
Здравствуйте, MaximE, Вы писали:

ME>
  • Сам факт, что до объявления кортежа нужно объявить имена его членов, а при объявлении объявить имена и их типы убивают всю идею на корню. Я не вижу, чем приведенный выше кортеж лучше, чем обычное
    ME>
    ME>struct my_struct
    ME> ...
    ME>


    +1

    Но с другой стороны Alexey Chen просто ошибся, назвав это tuple. Это конечно не кортеж, это именно структура.

    ME>Я вижу лишь что на описание этой же структуры в оригинальном коде ушло больше писанины без какой либо пользы.

    ME>
  • Практическая применимость такого кортежа в шаблонном коде близка к абсолютному нулю. Ничего не стоит в compile time определить количество членов boost::tuple и проитерироваться по его членам, так как индексом его членов является целое, результаты арифметических операций над которым вычисляются в compile time. По приведенному кортежу невозможно проитерироваться в generic коде, так как нужно знать имена членов. Возвращемся к тому, что индексы должны быть простыми целыми.

    Бред. Или я чего то не понимаю, или это типичный симптом пользователя буста(судя по количеству согласившихся). В данном случае можно спокойно обращаться к членам структуры по индексу, выяснять их количество, итерироваться в compile time. Я потратил ровно две минуты, чтобы написать такой код:

    #include <string>
    #include <iostream>
    #include <typeinfo>
    
    enum _n_Height  { n_Height };
    enum _n_Weight  { n_Weight };
    enum _n_Name    { n_Name };
    
    struct Fake_Struct { void operator []( Fake_Struct const& ); };
    
    template < class _Tx, class _Name, class _Super = Fake_Struct >
      struct Struct : _Super
        {
          using _Super::operator[];
    
          _Tx val_;
          _Tx& operator []( _Name n ) { return val_; }
    
          Struct() : val_(_Tx()) {}
        };
    
    typedef 
      Struct< int, _n_Height, Struct < float, _n_Weight, Struct < std::string, _n_Name > > >
      MyStruct;
    
    template <class T>
    struct tuple_iterate
    {
    };
    
    template <class T, class Y, class S>
    struct tuple_iterate<Struct<T, Y, S> >
    {
        static void eval()
        {
            std::cout << typeid(T).name() <<  " " << typeid(Y).name() << std::endl;
            tuple_iterate<S>::eval();
        }
    };
    
    template <class T, class Y>
    struct tuple_iterate<Struct<T, Y, Fake_Struct> >
    {
        static void eval()
        {
            std::cout << typeid(T).name() <<  " " << typeid(Y).name() << std::endl;
        }
    };
    
    int main()
    {
        MyStruct s;
    
        s[n_Height]  = 10;
        s[n_Weight]  = 20.3;
        s[n_Name]    = "name";
    
        std::cout << s[n_Height]  << std::endl << s[n_Weight]  << std::endl << s[n_Name]    << std::endl;
        tuple_iterate<MyStruct>::eval();
        return 0;
    }
  • Re[2]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 26.06.05 17:19
    Оценка: +1 -1
    Здравствуйте, MaximE, Вы писали:

    ME>Я вижу лишь что на описание этой же структуры в оригинальном коде ушло больше писанины без какой либо пользы.

    ME>
  • Практическая применимость такого кортежа в шаблонном коде близка к абсолютному нулю. Ничего не стоит в compile time определить количество членов boost::tuple и проитерироваться по его членам, так как индексом его членов является целое, результаты арифметических операций над которым вычисляются в compile time. По приведенному кортежу невозможно проитерироваться в generic коде, так как нужно знать имена членов. Возвращемся к тому, что индексы должны быть простыми целыми.

    Не буду спорить. Просто спрошу: что если я решал другую задачу, о которой Вы даже не подумали? Что если 'обобщённый код' не всегда совпадает с Modern C++ и метопрограммирование? Возможно есть и другие способы написания программ кроме как boost::... Наверное, но науке это, как водится, не известно.

    Однако сей вопрос к топику дела не имеет. Имеет дело другой. Вы всегда пишете только практически применимый самодостаточный неизбыточный код, максимально эффективно решающий задачу? Ответ можно в топик про то кто такие кодеры.

    Это была идея. Просто идея описания структуры в читабельном виде с возможностью рефлексии. Но не для использования_каждым_пионером_в_любом_месте_в_которое_он_только_сможет_это_воткнуть. Лично я рассматриваю такие вещи как искусство. Как на это смотреть другим, это их дело. _Мне_ нравится.

    Где и зачем может понадобиться такой приём я не буду расписывать, это уже специфика. Специфика же порождает непонимание людей не сталкивавшихся с ней. ИМХО, кому надо сам поймёт нужен ему такой приём или нет, я же просто поделился идеей. Лично вам идея не понравилась? Ну и ладно.
  • Re[3]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 26.06.05 17:48
    Оценка: +1 -1
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Не буду спорить. Просто спрошу: что если я решал другую задачу, о которой Вы даже не подумали?

    И что за задача? Она правда не решается с помощью boost.tuples? Не верю.

    AC>Что если 'обобщённый код' не всегда совпадает с Modern C++ и метопрограммирование? Возможно есть и другие способы написания программ кроме как boost::... Наверное, но науке это, как водится, не известно.

    Способы безусловно есть, но согласись boost удобней. Если сделаешь лучше — круто — но пока я не вижу, что это у тебя получилось.

    AC>Однако сей вопрос к топику дела не имеет. Имеет дело другой. Вы всегда пишете только практически применимый самодостаточный неизбыточный код, максимально эффективно решающий задачу? Ответ можно в топик про то кто такие кодеры.

    Извини конечно, но смысла я вообще не вижу в твоем коде, я могу получить то же самое с более c удобным синтаксисом и гораздо более простым повторным использованием (boost::tuples).

    AC>Это была идея. Просто идея описания структуры в читабельном? виде с возможностью рефлексии. Но не для использования_каждым_пионером_в_любом_месте_в_которое_он_только_сможет_это_воткнуть.

    AC>Лично я рассматриваю такие вещи как искусство.
    Искусство лишь тогда когда есть смысл и удобный синтаксис, здесь я его не вижу, а вот то, как написаны boost::tuples и boost::bind — это уже искусство и какой сделать такой syntactic sugar для пользователя.

    AC>Как на это смотреть другим, это их дело. _Мне_ нравится.

    Эт пожалуйста. Но лично я согласен с Максимом на 100%.

    AC>Где и зачем может понадобиться такой приём я не буду расписывать, это уже специфика. Специфика же порождает непонимание людей не сталкивавшихся с ней. ИМХО, кому надо сам поймёт нужен ему такой приём или нет, я же просто поделился идеей.

    Да нигде не понадобится. И синтаксис хромает, и удобство, да и смысла мало...

    Извини если что это все имхо, но в некоторых местах достаточно объективное...
    Re[14]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 11:48
    Оценка: -1 :)
    Здравствуйте, Pavel Chikulaev, Вы писали:

    PC>>>Еще вопросы есть? Тут еще надо посморить о красоте

    AC>>Ээээ. Есть. Вы о чем уважаемый?
    PC>Эт у меня коряво? По-моему у тебя этого больше, плюс у меня повторное использование, проверка от ошибок, удобный синтаксис, а что у тебя?

    У меня код. Ладно, ты победил, у тебя длинее.
    Давай я тебе лучше отрывок из Вини-Пуха зачитаю?

    — Да Кролик он умный
    — Кролик — он Хитрый
    — У него настояще мозги.
    — Да, у него Настоящие Мозги
    — И по этому он ничего не понимает.

    Re[3]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 09:15
    Оценка: 1 (1)
    Здравствуйте, Pavel Chikulaev, Вы писали:

    PC>Немного погодя покажу код, позволяющий делать следующее:

    Показываю Copyright мой. Не отвечаю за последствия от увиденного. Нервных прошу воздержаться от просмотра Работает на VC7.1 и VC8
    #include <boost/tuple/tuple.hpp>
    #include <boost/tuple/tuple_io.hpp>
    #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
    #include <boost/preprocessor/arithmetic/mul.hpp>
    #include <boost/preprocessor/punctuation/comma_if.hpp>
    #include <boost/utility/enable_if.hpp>
    #include <boost/mpl/vector.hpp>
    #include <boost/mpl/find.hpp>
    #include <boost/mpl/unique.hpp>
    #include <boost/mpl/size.hpp>
    #include <Boost/mpl/at.hpp>
    #include <boost/type_traits/is_same.hpp>
    #include <string>
    #include <iostream>
    
    #ifndef FAKIE_TAGGED_TUPLE_MAX_ARITY
    # define FAKIE_TAGGED_TUPLE_MAX_ARITY 10
    #elif FAKIE_TAGGED_TUPLE_MAX_ARITY > 10
    #error boost::tuples doesn't support arity > 10
    #endif
    
    namespace fakie
    {
        template<typename Types, typename Names, typename Base>
        struct tagged_tuple_detail 
            : virtual Base
            , boost::enable_if_c<boost::mpl::size<Types>::type::value == boost::mpl::size<Names>::type::value>
            , boost::enable_if<boost::is_same<boost::mpl::unique<Types>, Types> >
        {
            using Base::get;
    
            template<typename T>
            typename boost::tuples::access_traits<
                typename boost::mpl::at_c<
                    Types, 
                    boost::mpl::find<Names, T>::type::pos::value
                >::type
            >::non_const_type get ()
            {
                return boost::tuples::get<boost::mpl::find<Names, T>::type::pos::value>(*this);
            }
    
            template<typename T>
            typename boost::tuples::access_traits<
                typename boost::mpl::at_c<
                    Types, 
                    boost::mpl::find<Names, T>::type::pos::value
                >::type
            >::const_type get () const
            {
                return boost::tuples::get<boost::mpl::find<Names, T>::type::pos::value>(*this);
            }
        };
    
    #define FAKIE_TAGGED_TUPLE_DETAIL_TYPES(z, n, text)\
        BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(text, BOOST_PP_MUL(2, n))
    
    #define FAKIE_TAGGED_TUPLE_DETAIL_VALUES(z, n, text)\
        BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(text, BOOST_PP_ADD(BOOST_PP_MUL(2, n), 1))
    
    #define FAKIE_TAGGED_TUPLE_DETAIL_MPL_2_TUPLE(z, n, text)\
        BOOST_PP_COMMA_IF(n)\
        typename boost::mpl::if_<\
            boost::is_same<BOOST_PP_CAT(text, BOOST_PP_MUL(2, n)), boost::mpl::na>,\
            boost::tuples::null_type,\
            BOOST_PP_CAT(text, BOOST_PP_MUL(2, n))\
        >::type
    
        template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PP_MUL(2, FAKIE_TAGGED_TUPLE_MAX_ARITY), typename T, boost::mpl::na)>
        struct tagged_tuple
            : tagged_tuple_detail
            <
                boost::mpl::vector<BOOST_PP_REPEAT(FAKIE_TAGGED_TUPLE_MAX_ARITY, FAKIE_TAGGED_TUPLE_DETAIL_TYPES, T)>,
                boost::mpl::vector<BOOST_PP_REPEAT(FAKIE_TAGGED_TUPLE_MAX_ARITY, FAKIE_TAGGED_TUPLE_DETAIL_VALUES, T)>,
                boost::tuple<BOOST_PP_REPEAT(FAKIE_TAGGED_TUPLE_MAX_ARITY, FAKIE_TAGGED_TUPLE_DETAIL_MPL_2_TUPLE, T)>
            >
        {
        };
    
    #undef FAKIE_TAGGED_TUPLE_DETAIL_TYPES
    #undef FAKIE_TAGGED_TUPLE_DETAIL_VALUES
    #undef FAKIE_TAGGED_TUPLE_DETAIL_MPL_2_TUPLE
    }
    
    class name_t {};
    class value_t {};
    class weight_t {};
    
    int main()
    {
        using namespace fakie;
    
        tagged_tuple<std::string, name_t, int, value_t, double, weight_t> s;
        
        s.get<name_t>()   = "Hello World";
        s.get<value_t>()  = 2005;
        s.get<weight_t>() = 2.34543;
    
        std::cout << s;
    
        return k;
    }
    Re[5]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 10:10
    Оценка: 1 (1)
    Здравствуйте, korzhik, Вы писали:

    K>Здравствуйте, Pavel Chikulaev, Вы писали:


    C>>Ты видимо не в курсе про boost::fusion

    K>а что это такое ?
    Это наследник boost::tuple позволяет делать с кортежами ужас что компил-тайм операции, ран-тайм операции...
    До сих пор не в бусте официально, хотя лежит в 1.32
    /boost/spirit/phoenix/ — тут либа
    /libs/spirit/phoenix/ — тут примеры
    Насколько я знаю Joel de Guzman сейчас работает над второй версией, а потом уж будет ревью, и официальное включение в буст
    Re[3]: Aka Tuple
    От: MaximE Великобритания  
    Дата: 26.06.05 19:40
    Оценка: -1
    On Sun, 26 Jun 2005 21:19:54 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:

    []

    > Не буду спорить.


    Спорить нам не нужно. Приведи конкретные преимущества твоей идеи на конкретном реальном примере.

    > Просто спрошу: что если я решал другую задачу, о которой Вы даже не подумали? Что если 'обобщённый код' не всегда совпадает с Modern C++ и метопрограммирование? Возможно есть и другие способы написания программ кроме как boost::... Наверное, но науке это, как водится, не известно.


    Нам, простым смертным кодерам, не терпится достигнуть просветления и узнать ту высокую задачу, которую хранит твое чело. (прости, — не совершенен, не удержался )

    > Однако сей вопрос к топику дела не имеет. Имеет дело другой. Вы всегда пишете только практически применимый самодостаточный неизбыточный код, максимально эффективно решающий задачу? Ответ можно в топик про то кто такие кодеры.


    Последнее время — да, screw genericity. Следующая философия мне близка http://www.faqs.org/docs/artu/ch01s06.html

    > Это была идея. Просто идея описания структуры в читабельном виде с возможностью рефлексии. Но не для использования_каждым_пионером_в_любом_месте_в_которое_он_только_сможет_это_воткнуть. Лично я рассматриваю такие вещи как искусство. Как на это смотреть другим, это их дело. _Мне_ нравится.

    >
    > Где и зачем может понадобиться такой приём я не буду расписывать, это уже специфика. Специфика же порождает непонимание людей не сталкивавшихся с ней. ИМХО, кому надо сам поймёт нужен ему такой приём или нет, я же просто поделился идеей. Лично вам идея не понравилась? Ну и ладно.

    Еще раз попрошу конкретный пример, а не нытье про хрупкую душу художника, которую не просто понять. Мы — инженеры, форум технический, поэтому best ideas only.

    --
    Maxim Yegorushkin
    Posted via RSDN NNTP Server 1.9
    Re[6]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 26.06.05 22:22
    Оценка: +1
    Здравствуйте, MaximE, Вы писали:

    >> Простите, приемущества перед чем?

    ME>Перед обыкновенной структурой.

    Ах, Вы про это. Наверное надо было явно упомянуть, что данный приём позволяет перебрать все поля ака tuple при этом сохраняет читабельность структуры и допускает определение метаинформации для реализации рефлекшина. Такого обьяснения достаточно или надо подробнее?

    Извините, что написал только идею, надо наверное было писать много много кода, чтобы идеи было не видно, но зато было много неймспейсов, шаблонов и макросов. Как я посмотрю нынче это очень популярный способ изложения.
    Re[6]: Aka Tuple
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 27.06.05 06:05
    Оценка: +1
    Здравствуйте, MaximE, Вы писали:

    ME>On Mon, 27 Jun 2005 08:25:46 +0400, eao197 <31476@users.rsdn.ru> wrote:


    ME>[]


    >> Извините, коллеги, что вмешиваюсь в ваш холивар, но мне показалось (на первый взгляд, я не проверял на компиляторе), что в решении Alexey Chen
    Автор: Alexey Chen
    Дата: 21.06.05
    можно использовать не последовательно идущие значения enum-a. Например:

    >>
    >> enum stop_t  { cmd_stop = 0x1001 };
    >> enum start_t { cmd_start = 0x2000 };
    >> enum pause_t { cmd_pause = 0x40000 };
    >>

    >> (такие значения могут потребоваться, например, для управления каким-то внешним устройством).
    >>
    >> В то время как в boost::tuple необходимо использовать значения от 0 до k-1:

    ME>Не вижу как эту возможность иожно применить на практике.


    Ну, применить на практике и найти случай, когда boost::tuple не будет работать, это немного разные вещи. Имхо, я показал enum-ы, которые нельзя использовать для доступа к элементами boost::tuple.

    >>

    >> А вообще, по количеству упоминаний boost-а в данном форуме, слова Алексея (Re[4]: Aka Tuple
    Автор: Alexey Chen
    Дата: 27.06.05
    ):


    ME>[]


    >> Все же boost пока не стандарт, не везде работает, да и могут быть административно/политические причины не использовать boost. Поэтому я не думаю, что нужно обязательно при публикации какой-то идеи проводить ее сравние с boost-ом. А то это начинает напоминать проверки на соответствие "генеральной линии партии и коммунистической идеологии" в недавние времена


    ME>Я хочу лишь один малюсенький пример реального кода, где такой кортеж решает задачу лучше, чем обыкновенная структура или boost::tuple. Сранение с boost'ом пришлось потому, что там тоже есть кортеж, доступ к элементам которого, в отличие от приведенного кортежа, можно осуществить в generic коде.


    А я думаю, что подобный пример следует требовать в случае, когда автор идеи начинает пропагандировать ее и навязывать вместо boost/ace/stlsoft/whatever. Здесь же, имхо, такого нет.
    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[11]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 28.06.05 20:57
    Оценка: :)
    Здравствуйте, jazzer, Вы писали:

    J>Это ты, батенька, закушался просто

    +1

    J>Вот воинственный Алексей сидит на безнадежном сановском компилере, посмотри при случае regression буста на нем.

    Ну вот в воинственных записали. Интересно светлых или тёмных?

    Я просто общительный и весёлый (в меру упитанный и в самом рассвете сил), только шутки у меня все из шестой палаты
    Re[4]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 26.06.05 19:39
    Оценка:
    Здравствуйте, Pavel Chikulaev, Вы писали:

    AC>>Не буду спорить. Просто спрошу: что если я решал другую задачу, о которой Вы даже не подумали?

    PC>И что за задача? Она правда не решается с помощью boost.tuples? Не верю.
    Твоё право. Но я не буду постить здесь кода больше чем на экран. И ни кому ни чего доказывать тоже не буду. Я не для для сюда пришёл. А делать же лучше, круче, моднее... длиной без меня пожалуйста мерейтесь. Я всего лишь показал интересную _на_мой_ взгляд идею. Ты считаешь что это бред. Пожалуйста, и разубеждать тебя в этом я не буду. Зачем мне это? Будем считать что ты прав, и меня после пива в голове помутнение возникло, захотелось чегой-то изобразить. Пускай для тебя это будет обьяснением моей задачи. Ок?

    PC>Извини конечно, но смысла я вообще не вижу в твоем коде, я могу получить то же самое с более c удобным синтаксисом и гораздо более простым повторным использованием (boost::tuples).

    Дык, уже как-то пытался обьяснить что 'смысла я вообще не вижу' и 'вижу что смысла вообще нет' не одно и то же. Но прекратил попытки это делать. Бесполезное занятие.

    PC>Извини если что это все имхо, но в некоторых местах достаточно объективное...

    Дык, это публичный форум. Здесь любое мнение 'обьективное'
    Re: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 26.06.05 20:59
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Заглянул тут в книжку Вандервурда. Там в главе про Tupple, штука такая есть — val<n>. Удобно конечно, но у меня возникла идея, возможно старая как мир. Но таки приведу её на правах прикола.


    Я так понял по откликам мастеров пера, что надо обьяснить суть идеи.

    Суть проста. Использовать для индексирования полей структуры типы. В отличии от кортежа, который я упомянул в начале топика, такой подход имеет смысл для создания метаинформации о структуре при сохранении естественного доступа к её (структуры) элементам. И, что важно, не отменяет возможности доступа по номеру. Иначе говоря это тот же tuple, но с хуманридабл тегами.

    Это позволяет писать понятный код и с минимальными усилиями реализовывать например сериализацию.

    Был приведён такой пример
    typedef tuple<int, float, std::string> my_struct;
    enum { height, weight, name };
    // ...
    my_struct s;
    get<height>(s) = 1;

    Да конечно можно и так, только это совсем не то. Да и ещё надо не забыть поддерживать соответствие перечисления и кортежа.

    Второй пример — это адаптация под примитивный компилятор. Но суть идеи не в самой адаптации, а в приёме который для этого использован. Кстати, сам код может также подтолкнуть к некоторым интересным идеям, но уже архитектурным.
    Re[5]: Aka Tuple
    От: MaximE Великобритания  
    Дата: 26.06.05 22:07
    Оценка:
    On Mon, 27 Jun 2005 00:04:21 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:

    > ME>Спорить нам не нужно. Приведи конкретные преимущества твоей идеи на конкретном реальном примере.

    >
    > Простите, приемущества перед чем?

    Перед обыкновенной структурой.

    --
    Maxim Yegorushkin
    Posted via RSDN NNTP Server 1.9
    Re[7]: Aka Tuple
    От: MaximE Великобритания  
    Дата: 27.06.05 05:41
    Оценка:
    On Mon, 27 Jun 2005 02:22:58 +0400, Alexey Chen <17658@users.rsdn.ru> wrote:

    >>> Простите, приемущества перед чем?

    > ME>Перед обыкновенной структурой.
    >
    > Ах, Вы про это. Наверное надо было явно упомянуть, что данный приём позволяет перебрать все поля ака tuple при этом сохраняет читабельность структуры и допускает определение метаинформации для реализации рефлекшина. Такого обьяснения достаточно или надо подробнее?

    Недостаточно. Напиши, пожалуйста, шаблон ф-ции, которая будет итерироваться по членам твоего кортежа (такая ф-ция необходима для реализации упомянутого тобой рефлекшена).

    --
    Maxim Yegorushkin
    Posted via RSDN NNTP Server 1.9
    Re[5]: Aka Tuple
    От: MaximE Великобритания  
    Дата: 27.06.05 05:49
    Оценка:
    On Mon, 27 Jun 2005 08:25:46 +0400, eao197 <31476@users.rsdn.ru> wrote:

    []

    > Извините, коллеги, что вмешиваюсь в ваш холивар, но мне показалось (на первый взгляд, я не проверял на компиляторе), что в решении Alexey Chen
    Автор: Alexey Chen
    Дата: 21.06.05
    можно использовать не последовательно идущие значения enum-a. Например:

    >
    > enum stop_t  { cmd_stop = 0x1001 };
    > enum start_t { cmd_start = 0x2000 };
    > enum pause_t { cmd_pause = 0x40000 };
    >

    > (такие значения могут потребоваться, например, для управления каким-то внешним устройством).
    >
    > В то время как в boost::tuple необходимо использовать значения от 0 до k-1:

    Не вижу как эту возможность иожно применить на практике.

    >

    > А вообще, по количеству упоминаний boost-а в данном форуме, слова Алексея (Re[4]: Aka Tuple
    Автор: Alexey Chen
    Дата: 27.06.05
    ):


    []

    > Все же boost пока не стандарт, не везде работает, да и могут быть административно/политические причины не использовать boost. Поэтому я не думаю, что нужно обязательно при публикации какой-то идеи проводить ее сравние с boost-ом. А то это начинает напоминать проверки на соответствие "генеральной линии партии и коммунистической идеологии" в недавние времена


    Я хочу лишь один малюсенький пример реального кода, где такой кортеж решает задачу лучше, чем обыкновенная структура или boost::tuple. Сранение с boost'ом пришлось потому, что там тоже есть кортеж, доступ к элементам которого, в отличие от приведенного кортежа, можно осуществить в generic коде.

    --
    Maxim Yegorushkin
    Posted via RSDN NNTP Server 1.9
    Re[2]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 05:53
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Здравствуйте, Alexey Chen, Вы писали:


    AC>>Заглянул тут в книжку Вандервурда. Там в главе про Tupple, штука такая есть — val<n>. Удобно конечно, но у меня возникла идея, возможно старая как мир. Но таки приведу её на правах прикола.

    См. Александреску, а потом boost::tuples, а потом boost::mpl...

    AC>Я так понял по откликам мастеров пера, что надо обьяснить суть идеи.


    AC>Суть проста. Использовать для индексирования полей структуры типы. В отличии от кортежа, который я упомянул в начале топика, такой подход имеет смысл для создания метаинформации о структуре при сохранении естественного доступа к её (структуры) элементам. И, что важно, не отменяет возможности доступа по номеру. Иначе говоря это тот же tuple, но с хуманридабл тегами.


    Немного погодя покажу код, позволяющий делать следующее:
    class name_t   {};
    class number_t {};
    tagged_tuple<std::string, name_t, int, number_t> s;
    s.get<name_t>() = "hello world";
    s.get<number_t>() = 2005;
    assert(s.get<0>() == s.get<name_t>());
    assert(s.get<1>() == s.get<number_t>());

    О пользователе надо заботится

    AC>Это позволяет писать понятный код и с минимальными усилиями реализовывать например сериализацию.

    Да ты что!
    Ты наверно просто не в курсе:
    boost::tuple<std::string, int> s;
    cin  >> s;
    cout << s;


    AC>Второй пример — это адаптация под примитивный компилятор. Но суть идеи не в самой адаптации, а в приёме который для этого использован. Кстати, сам код может также подтолкнуть к некоторым интересным идеям, но уже архитектурным.

    boost::tuples сделает твой пример по переносимости так что про это даже не вспоминай. Какие идеи? В компил-тайм длину посчитать или перевернуть список типов?
    Re[6]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 09:25
    Оценка:
    Здравствуйте, MaximE, Вы писали:

    ME>Я хочу лишь один малюсенький пример реального кода, где такой кортеж решает задачу лучше, чем обыкновенная структура или boost::tuple. Сранение с boost'ом пришлось потому, что там тоже есть кортеж, доступ к элементам которого, в отличие от приведенного кортежа, можно осуществить в generic коде.


    Код приводить не буду, он слишком большой и неинтересный. Конкретное применение — например, реализация SMPP протокола, представление PDU таким картежем.

    Вообще любое использование структуры которая нужна как человеку так и для предстваления в пакетном виде для передачи. При этом имеющая опциональные поля и транслируемая частично или полностью в из TLV.
    Re[7]: Aka Tuple
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 27.06.05 09:46
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Здравствуйте, MaximE, Вы писали:


    ME>>Я хочу лишь один малюсенький пример реального кода, где такой кортеж решает задачу лучше, чем обыкновенная структура или boost::tuple. Сранение с boost'ом пришлось потому, что там тоже есть кортеж, доступ к элементам которого, в отличие от приведенного кортежа, можно осуществить в generic коде.


    AC>Код приводить не буду, он слишком большой и неинтересный. Конкретное применение — например, реализация SMPP протокола, представление PDU таким картежем.


    А вот с этого места, если можно, поподробнее.
    Ты вообще PDU хочешь представлять такими кортежами? Т.е. типа submit_sm, deliver_sm и т.д.?
    Или речь идет об optional TLV? Но ведь в одном только submit_sm этих TLV штук сорок (в smpp 5.0 я насчитал 44).
    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[3]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 09:51
    Оценка:
    Здравствуйте, uw, Вы писали:

    uw>Бред. Или я чего то не понимаю, или это типичный симптом пользователя буста(судя по количеству согласившихся). В данном случае можно спокойно обращаться к членам структуры по индексу, выяснять их количество, итерироваться в compile time. Я потратил ровно две минуты, чтобы написать такой код:

    А что уже бустом пользоватся плохо? И там и здесь можно итерироватся. Но какая разница? Просто я очень не люблю велосипеды, особенно корявые и не доделанные, и с никаким удобством.

    Две минуты — и что? Ты видимо не в курсе про boost::fusion

    Я понимаю еще если буст не работает на твоей платформе... но ведь он скорее всего работает...
    Re[4]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 09:52
    Оценка:
    Здравствуйте, Pavel Chikulaev, Вы писали:

    PC>Здравствуйте, Pavel Chikulaev, Вы писали:


    PC>>Немного погодя покажу код, позволяющий делать следующее:

    PC>Показываю Copyright мой. Не отвечаю за последствия от увиденного. Нервных прошу воздержаться от просмотра Работает на VC7.1 и VC8

    Круто. Хм, только надо поменять return k на что-нить компиляющееся.

    Хороший показательный пример программирования на BOOST++. Звиняй, но я пишу на С++, потому в моём коде ты таких диких конструкций не увидишь.


    И ещё тебя не смущает результат такого вот кода

    std::cout << sizeof(int) << std::endl;
    std::cout << sizeof(double) << std::endl;
    std::cout << sizeof(tagged_tuple<int, value_t, double, weight_t>) << std::endl;
    Re[5]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 10:01
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Круто. Хм, только надо поменять return k на что-нить компиляющееся.

    Ну да и что Щас из-за debugной переменной будем устраивать...

    AC>Хороший показательный пример программирования на BOOST++. Звиняй, но я пишу на С++, потому в моём коде ты таких диких конструкций не увидишь.

    У меня их как раз меньше... Код библиотеки никто не смотрит... Главное синтаксис для пользователя. А тебе придется смирится с этим синтаксисом:
    typedef 
      Struct< int, _n_Height, Struct < float, _n_Weight, Struct < std::string, _n_Name > > >
      MyStruct;


    AC>
    AC>std::cout << sizeof(tagged_tuple<int, value_t, double, weight_t>) << std::endl;
    AC>

    Я знаю, оверхэд из-за виртуального наследования... щас добавлю пять строк на все конструкторы и никакого оверхэда совсем. Зато пользователь радуется, в отличие от твоего
    Re[4]: Aka Tuple
    От: korzhik Россия  
    Дата: 27.06.05 10:05
    Оценка:
    Здравствуйте, Pavel Chikulaev, Вы писали:

    C>Ты видимо не в курсе про boost::fusion

    а что это такое ?
    Re[3]: Aka Tuple
    От: e-Xecutor Россия  
    Дата: 27.06.05 10:10
    Оценка:
    Здравствуйте, Pavel Chikulaev, Вы писали:


    PC>boost::tuples сделает твой пример по переносимости так что про это даже не вспоминай. Какие идеи? В компил-тайм длину посчитать или перевернуть список типов?


    Ээээ. Что там про переносимость?
    Попробовал я твой пример сановским компайлером скомпилять.
    Фик, однако.
    Так что, не надо про переносимость, плиз.
    Re[8]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 10:12
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>А вот с этого места, если можно, поподробнее.

    E>Ты вообще PDU хочешь представлять такими кортежами? Т.е. типа submit_sm, deliver_sm и т.д.?
    E>Или речь идет об optional TLV? Но ведь в одном только submit_sm этих TLV штук сорок (в smpp 5.0 я насчитал 44).

    Да вообще. Для не TLV полей такой кортеж явно задаёт порядок полей а дополнительная информация (когда она нужна) может быть задана трейтсами. Тоже и для опциональных TLV полей, но для них ещё может присутствовать информация о наличии/отстутсвии значения. Причём всё это практически в автоматическом режими. В принципе часть такого предстваления может быть задана динамически расширяемой (в самой структуре поля не присутствуют, пока реально им значение не присвоено) но это уже к самой идее отношения тоже не имеет.

    Когда я реализовывал этот протокол (два года назад), затрахался писать кодирование/декодирование... макросы конечно помогли, но не что бы очень. Опять же надо принимать в расщёт компилеры на которых такие вещи пишутся. В моём случае это был Sun C++.
    Re[4]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 10:14
    Оценка:
    Здравствуйте, e-Xecutor, Вы писали:

    PC>>boost::tuples сделает твой пример по переносимости так что про это даже не вспоминай. Какие идеи? В компил-тайм длину посчитать или перевернуть список типов?


    EX>Ээээ. Что там про переносимость?

    Переносимость про буст.
    EX>Попробовал я твой пример сановским компайлером скомпилять.
    А ты мой код пытался с компилить. Он таким свойством не обладает Возможно пока.
    Компилятор не ахти
    Re[6]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 10:18
    Оценка:
    Здравствуйте, Pavel Chikulaev, Вы писали:

    PC>Код библиотеки никто не смотрит... Главное синтаксис для пользователя.

    Хм, аргумент убийственной силы... до первого краша. ИМХО, не стит забывать что даже если ты пишешь на BOOST++ проблемы С++ никто не отменял. А копаться в макаронах из каталога boost... таких денег никто не платит разве что только из большой любви к искуству.
    Re[9]: Aka Tuple
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 27.06.05 10:22
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Здравствуйте, eao197, Вы писали:


    E>>А вот с этого места, если можно, поподробнее.

    E>>Ты вообще PDU хочешь представлять такими кортежами? Т.е. типа submit_sm, deliver_sm и т.д.?
    E>>Или речь идет об optional TLV? Но ведь в одном только submit_sm этих TLV штук сорок (в smpp 5.0 я насчитал 44).

    AC>Да вообще. Для не TLV полей такой кортеж явно задаёт порядок полей а дополнительная информация (когда она нужна) может быть задана трейтсами. Тоже и для опциональных TLV полей, но для них ещё может присутствовать информация о наличии/отстутсвии значения. Причём всё это практически в автоматическом режими. В принципе часть такого предстваления может быть задана динамически расширяемой (в самой структуре поля не присутствуют, пока реально им значение не присвоено) но это уже к самой идее отношения тоже не имеет.


    Мудрено как-то все. Я для хранения TLV использую обычный std::map.

    AC>Когда я реализовывал этот протокол (два года назад), затрахался писать кодирование/декодирование... макросы конечно помогли, но не что бы очень.


    Опять же странно. Там все достаточно просто делается (имхо, конечно). Вот, например:
    void
    submit_deliver_base_t::write_to(
        pdu_t & to,
        command_header_t::integer_t sequence_number ) const
    {
        // Промежуточный буфер, в который помещается
        // временное двоичное значение.
        oess_1::io::mem_buf_t buf;
    
        // Записываем обязательные параметры.
        buf << m_service_type
            << m_source_addr_ton
            << m_source_addr_npi
            << m_source_addr
            << m_dest_addr_ton
            << m_dest_addr_npi
            << m_dest_addr
            << m_esm_class
            << m_protocol_id
            << m_priority_flag
            << m_schedule_delivery_time
            << m_validity_period
            << m_registered_delivery
            << m_replace_if_present_flag
            << m_data_coding
            << m_sm_default_msg_id
            << m_short_message
        // Записываем необязательные параметры.
            << opt_params();
    
        // Формируем PDU.
        to.set( m_command_id,
            // command_status должен быть 0.
            0,
            sequence_number,
            buf.size(),
            reinterpret_cast< const pdu_t::octet_t * >( buf.ptr() ) );
    }


    И нет проблем.
    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[7]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 10:25
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Здравствуйте, Pavel Chikulaev, Вы писали:


    PC>>Код библиотеки никто не смотрит... Главное синтаксис для пользователя.

    AC>Хм, аргумент убийственной силы... до первого краша. ИМХО, не стит забывать что даже если ты пишешь на BOOST++ проблемы С++ никто не отменял. А копаться в макаронах из каталога boost... таких денег никто не платит разве что только из большой любви к искуству.
    Лично у меня таких проблем нет, но для этого есть STLFilt, но...
    В принципе я согласен искать возможно будешь долго(это полезно кстати), т.к. нереализована отображение ошибок, как показывал Александреску, это бы очень пригодилось. Но обычно через некоторое время использования библиотеки ошибки находятся очень быстро и лазить туда не нужно становится..

    У тебя прям какая-то бусто фобия
    Re[10]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 10:36
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Мудрено как-то все. Я для хранения TLV использую обычный std::map.

    Хум-хоу Только не забудь про тормаза на хипе. В моём случае это был многопоточный сервер на мнгопроцессорной машине.

    AC>>Когда я реализовывал этот протокол (два года назад), затрахался писать кодирование/декодирование... макросы конечно помогли, но не что бы очень.

    E>Опять же странно. Там все достаточно просто делается (имхо, конечно). Вот, например:
    E>
    E>    buf << m_service_type
    E>    // Формируем PDU.
    E>

    E>И нет проблем.
    Действительно нет, надо только как-то различать два вида строк, разный размер полей и хитрые поля, например error_info. И это можно делать по-разному. При этом код, который пишет твою мапу, ещё должен иметь таблицу соответствия ключей и информации о теге и кодировании значения. Очень важным является вопрос где эта информация хранится и как ты добиваешся целостности.
    Re[8]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 10:43
    Оценка:
    Здравствуйте, Pavel Chikulaev, Вы писали:

    PC>У тебя прям какая-то бусто фобия

    Да не, просто прикольно. Каждый раз когда начинается обсуждения какой-либо идеи, кода, задачи на C++, обязательно кто-то будет доказывать что всё уже изобрели. Надо только взять буст, подкрутить, смазать, доработать напильником, два раза перевернуться через голову и сазать хоп. И получится тоже саме, но в разы лучше, а на мелкие мелочи ... чё на них внимание обращать, зато буст!

    Не, правда. Сделайте форум BOOST++ и резвитесь там в своё удовольствие, но ИМХО, C++ и буст отнюдь не синонимы.
    Re[9]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 10:45
    Оценка:
    Здравствуйте, korzhik, Вы писали:

    K>Здравствуйте, Pavel Chikulaev, Вы писали:


    PC>>У тебя прям какая-то бусто фобия


    K>А у тебя прям бусто мания! Честное слово!

    1. На моей платформе и компиляторе буст замечательно работает (VC7.1). От чего ж мне его не использовать?
    2. А ты к David Abrahams с такими заявлениями не обращался?
    3. Буст лично мне много нерв и часов сэкономил, за что спасибо. Без велосипедов обошелся, некоторых.
    4. А то что я в курсе всех дел? Ну и что, я ж не знаю какие ты новости отслеживаешь, мне это интересно.
    5. Ну в этом форуме почти все извращенцы — до такой степени изучать С++ , но ведь об этом никто не говорит, это нормально, а буст уже лишко. так?


    Млин ну от тебя-то не ожидал
    Re[11]: Aka Tuple
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 27.06.05 10:48
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Здравствуйте, eao197, Вы писали:


    E>>Мудрено как-то все. Я для хранения TLV использую обычный std::map.

    AC>Хум-хоу Только не забудь про тормаза на хипе. В моём случае это был многопоточный сервер на мнгопроцессорной машине.

    В моем случае многопоточный сервер на однопроцессорной (пока) машине
    По сравнению с затратами на логирование входящих/исходящих PDU затраты на хранение TLV-полей в хипе можно не считать. Кроме того, если это станет узким местом, то для этого мапа можно свой аллокатор приделать.

    AC>>>Когда я реализовывал этот протокол (два года назад), затрахался писать кодирование/декодирование... макросы конечно помогли, но не что бы очень.

    E>>Опять же странно. Там все достаточно просто делается (имхо, конечно). Вот, например:
    E>>
    E>>    buf << m_service_type
    E>>    // Формируем PDU.
    E>>

    E>>И нет проблем.
    AC>Действительно нет, надо только как-то различать два вида строк,

    нет проблем:
    class    SMPP_PDU_1_TYPE    c_string_t
    :    public std::string
    ,    public smpp_serializable_t
    {
    ...
    };
    
    //! Извлечение объекта из потока.
    inline oess_1::io::istream_t &
    operator>>( oess_1::io::istream_t & from, c_string_t & o )
    {
        o.read_from( from );
        return from;
    }
    
    //! Помещение объекта в поток.
    inline oess_1::io::ostream_t &
    operator<<( oess_1::io::ostream_t & to,
        const c_string_t & o )
    {
        o.write_to( to );
        return to;
    }
    
    template< class Length_type >
    class    octet_string_t
    :    public std::string
    ,    public smpp_serializable_t
    {
    ...
    };
    
    //! Извлечение объекта из потока.
    template< class Length_type >
    inline oess_1::io::istream_t &
    operator>>( oess_1::io::istream_t & from,
        octet_string_t< Length_type > & o )
    {
        o.read_from( from );
        return from;
    }
    
    //! Помещение объекта в поток.
    template< class Length_type >
    inline oess_1::io::ostream_t &
    operator<<( oess_1::io::ostream_t & to,
        const octet_string_t< Length_type > & o )
    {
        o.write_to( to );
        return to;
    }


    AC>И это можно делать по-разному.


    Конечно. Просто я удивлен, что ты выбрал достаточно хитрый способ.

    AC>При этом код, который пишет твою мапу, ещё должен иметь таблицу соответствия ключей и информации о теге и кодировании значения. Очень важным является вопрос где эта информация хранится и как ты добиваешся целостности.


    Да с этим так же проблем нет. И целостность я не нарушаю
    Хотя пока из TLV беру только то, что нужно. Все TLV не разбираю, а храню в мапе в бинарном виде.
    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[9]: Aka Tuple
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 27.06.05 10:51
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>ИМХО, C++ и буст отнюдь не синонимы.


    Пока.

    Имхо
    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[6]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 10:57
    Оценка:
    Здравствуйте, Pavel Chikulaev, Вы писали:

    PC>Я знаю, оверхэд из-за виртуального наследования... щас добавлю пять строк на все конструкторы и никакого оверхэда совсем. Зато пользователь радуется, в отличие от твоего

    Все оверхэда нет, щас как плайн-структура
    #include <boost/tuple/tuple.hpp>
    #include <boost/tuple/tuple_io.hpp>
    #include <boost/preprocessor/repetition/enum_params.hpp>
    #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
    #include <boost/preprocessor/repetition/enum_binary_params.hpp>
    #include <boost/preprocessor/repeat_from_to.hpp>
    #include <boost/preprocessor/arithmetic/mul.hpp>
    #include <boost/preprocessor/punctuation/comma_if.hpp>
    #include <boost/utility/enable_if.hpp>
    #include <boost/mpl/vector.hpp>
    #include <boost/mpl/find.hpp>
    #include <boost/mpl/unique.hpp>
    #include <boost/mpl/size.hpp>
    #include <Boost/mpl/at.hpp>
    #include <boost/type_traits/is_same.hpp>
    #include <string>
    #include <iostream>
    
    #ifndef FAKIE_TAGGED_TUPLE_MAX_ARITY
    # define FAKIE_TAGGED_TUPLE_MAX_ARITY 10
    #elif FAKIE_TAGGED_TUPLE_MAX_ARITY > 10
    #error boost::tuples doesn't support arity > 10
    #endif
    
    namespace fakie
    {
    
    #define FAKIE_TAGGED_TUPLE_DETAIL_TYPES(z, n, text)\
        BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(text, BOOST_PP_MUL(2, n))
    
    #define FAKIE_TAGGED_TUPLE_DETAIL_VALUES(z, n, text)\
        BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(text, BOOST_PP_ADD(BOOST_PP_MUL(2, n), 1))
    
    #define FAKIE_TAGGED_TUPLE_DETAIL_MPL_2_TUPLE(z, n, text)\
        BOOST_PP_COMMA_IF(n)\
        typename boost::mpl::if_<\
            boost::is_same<BOOST_PP_CAT(text, BOOST_PP_MUL(2, n)), boost::mpl::na>,\
            boost::tuples::null_type,\
            BOOST_PP_CAT(text, BOOST_PP_MUL(2, n))\
        >::type
    
        template<typename Types, typename Names>
        struct detail_check_types_and_names
            : boost::enable_if_c<boost::mpl::size<Types>::type::value == boost::mpl::size<Names>::type::value>
            , boost::enable_if<boost::is_same<typename boost::mpl::unique<Types>::type, Types> >
        {
        };
    
        template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PP_MUL(2, FAKIE_TAGGED_TUPLE_MAX_ARITY), typename T, boost::mpl::na)>
        struct tagged_tuple
            : boost::tuple<BOOST_PP_REPEAT(FAKIE_TAGGED_TUPLE_MAX_ARITY, FAKIE_TAGGED_TUPLE_DETAIL_MPL_2_TUPLE, T)>
        {
            typedef boost::mpl::vector<BOOST_PP_REPEAT(FAKIE_TAGGED_TUPLE_MAX_ARITY, FAKIE_TAGGED_TUPLE_DETAIL_TYPES, T)>  Types;
            typedef boost::mpl::vector<BOOST_PP_REPEAT(FAKIE_TAGGED_TUPLE_MAX_ARITY, FAKIE_TAGGED_TUPLE_DETAIL_VALUES, T)> Names;
            typedef boost::tuple<BOOST_PP_REPEAT(FAKIE_TAGGED_TUPLE_MAX_ARITY, FAKIE_TAGGED_TUPLE_DETAIL_MPL_2_TUPLE, T)>  Base;
    
    #define FAKIE_TAGGED_TUPLE_DETAIL_CTORS(z, n, text)\
            template<BOOST_PP_ENUM_PARAMS(n, typename U)>\
            tagged_tuple(BOOST_PP_ENUM_BINARY_PARAMS(n, U, & u), detail_check_types_and_names<Types, Names> * = 0)\
                : Base(BOOST_PP_ENUM_PARAMS(n, u)) {}
    
            tagged_tuple(detail_check_types_and_names<Types, Names> * = 0) {}
    
            BOOST_PP_REPEAT_FROM_TO(1, FAKIE_TAGGED_TUPLE_MAX_ARITY, FAKIE_TAGGED_TUPLE_DETAIL_CTORS, _)
    
    #undef  FAKIE_TAGGED_TUPLE_DETAIL_CTORS
    
            using Base::get;
    
            template<typename T>
            typename boost::tuples::access_traits<
                typename boost::mpl::at_c<
                    Types, 
                    boost::mpl::find<Names, T>::type::pos::value
                >::type
            >::non_const_type get ()
            {
                return boost::tuples::get<boost::mpl::find<Names, T>::type::pos::value>(*this);
            }
    
            template<typename T>
            typename boost::tuples::access_traits<
                typename boost::mpl::at_c<
                    Types, 
                    boost::mpl::find<Names, T>::type::pos::value
                >::type
            >::const_type get () const
            {
                return boost::tuples::get<boost::mpl::find<Names, T>::type::pos::value>(*this);
            }
        };
    
    #undef FAKIE_TAGGED_TUPLE_DETAIL_TYPES
    #undef FAKIE_TAGGED_TUPLE_DETAIL_VALUES
    #undef FAKIE_TAGGED_TUPLE_DETAIL_MPL_2_TUPLE
    }
    
    class name_t {};
    class value_t {};
    class weight_t {};
    
    int main()
    {
        using namespace fakie;
    
        tagged_tuple<std::string, name_t, int, value_t> s;
        
        s.get<name_t>()   = "Hello World";
        s.get<value_t>()  = 2005;
    
        std::cout << s << ' '
                  << sizeof(s) << ' '
                  << sizeof(boost::tuple<std::string, int>) << ' '
                  << sizeof(std::string) + sizeof(int);
    
        return 0;
    }
    Re[12]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 10:59
    Оценка:
    Здравствуйте, eao197, Вы писали:
    AC>>И это можно делать по-разному.
    E>Конечно. Просто я удивлен, что ты выбрал достаточно хитрый способ.
    Ну эту идею я придумал... по числу топика можно посмотреть, SMPP реализовывал, два года назад. И примерно так как ты показал. Плюс/минус погрешность. И мне не понравилось. Если бы сейчас стал делать, попробывал бы именно то что предложил. Но как я уже сказал с самого начала, это только голая идея. Вариантные протоколы с представлением для пользователя пакета как структуры — это возможное применение. Опять же, не значит, что надо брость всё и именно так делать. Это просто идея. Так что не надо напрягаться и искать в ней скрытый или великий смысл.
    Re[13]: Aka Tuple
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 27.06.05 11:10
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Здравствуйте, eao197, Вы писали:

    AC>>>И это можно делать по-разному.
    E>>Конечно. Просто я удивлен, что ты выбрал достаточно хитрый способ.
    AC>Ну эту идею я придумал... по числу топика можно посмотреть, SMPP реализовывал, два года назад. И примерно так как ты показал. Плюс/минус погрешность. И мне не понравилось. Если бы сейчас стал делать, попробывал бы именно то что предложил. Но как я уже сказал с самого начала, это только голая идея. Вариантные протоколы с представлением для пользователя пакета как структуры — это возможное применение. Опять же, не значит, что надо брость всё и именно так делать. Это просто идея. Так что не надо напрягаться и искать в ней скрытый или великий смысл.

    Алексей, так ведь я просто из того, чтобы чужой ошибки не повторить. Если тебе реализация SMPP в лоб не понравилась, то может и я на те же грабли со временем наступлю. А вот этого хотелось бы избежать.

    Так что я без всяких наездов, просто опыт перенять.
    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[10]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 11:11
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Здравствуйте, Alexey Chen, Вы писали:


    AC>>ИМХО, C++ и буст отнюдь не синонимы.

    E>Пока.
    Если в С++ ещё и буст втащить, то точно языку трындец будет.

    Надеюсь что никогда такого не будут, за исключением реализации пары классов, которые к бусту имеют весьма посредственное отношение. Ну пользует он что-то похожее.

    Тот же BOOST++, на котором ув. апологет написал свой пример, к С++ вообще имеет слабое отношение. ИМХО, конечно Это другой язык, со своим синтаксисом и семантикой. На мой взгляд, до ужаса кривой и неудобный.
    Re[10]: Aka Tuple
    От: Аноним  
    Дата: 27.06.05 11:12
    Оценка:
    Здравствуйте, Pavel Chikulaev, Вы писали:

    K>>А у тебя прям бусто мания! Честное слово!


    PC>2. А ты к David Abrahams с такими заявлениями не обращался?

    Сегодня вечером обращусь.

    PC>3. Буст лично мне много нерв и часов сэкономил, за что спасибо. Без велосипедов обошелся, некоторых.

    Это да.
    Другой вопрос что часто не от тебя зависит выбор инструментов. Ну это уже тоже тыщу раз обсуждалось

    PC>4. А то что я в курсе всех дел? Ну и что, я ж не знаю какие ты новости отслеживаешь, мне это интересно.

    Я тоже люблю в минуты одиночества поизучать код boost.
    Вообще у меня отношение к нему как к учебнику.

    PC>Млин ну от тебя-то не ожидал

    Да я на самом деле агент под прикрытием, работаю на тайную ассоциацию "Велосипедостроителей".
    Вхожу в доверие бустоманам и переманиваю их на нашу сторону Но ты крепкий орешек оказался...
    Re[11]: Aka Tuple
    От: korzhik Россия  
    Дата: 27.06.05 11:16
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>Здравствуйте, Pavel Chikulaev, Вы писали:


    K>>>А у тебя прям бусто мания! Честное слово!


    PC>>2. А ты к David Abrahams с такими заявлениями не обращался?

    А>Сегодня вечером обращусь.

    это я был.
    Re[11]: Aka Tuple
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 27.06.05 11:18
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Тот же BOOST++, на котором ув. апологет написал свой пример, к С++ вообще имеет слабое отношение. ИМХО, конечно Это другой язык, со своим синтаксисом и семантикой. На мой взгляд, до ужаса кривой и неудобный.


    ... << RSDN@Home 1.1.4 beta 7 rev. 447>>


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[11]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 11:19
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    PC>>2. А ты к David Abrahams с такими заявлениями не обращался?

    А>Сегодня вечером обращусь.
    А толку?

    PC>>3. Буст лично мне много нерв и часов сэкономил, за что спасибо. Без велосипедов обошелся, некоторых.

    А>Это да.
    А>Другой вопрос что часто не от тебя зависит выбор инструментов. Ну это уже тоже тыщу раз обсуждалось
    Мне посчастиливилось у меня все работает, и отказываться из дурацких non-compliant компиляторов не собираюсь, будущее компании я знаю, так что у разбитого корыта не останусь...

    PC>>4. А то что я в курсе всех дел? Ну и что, я ж не знаю какие ты новости отслеживаешь, мне это интересно.

    А>Я тоже люблю в минуты одиночества поизучать код boost.
    Да не изучаю я код буст Я и так знаю как там примерно написано, седня первый раз за несколько недель заглянул, boost::mpl::na искал, забыл как называется

    А>Вообще у меня отношение к нему как к учебнику.

    Я его использую в промышленном коде и радуюсь, что еще время сэкономил
    Re[11]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 11:26
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Здравствуйте, eao197, Вы писали:


    E>>Здравствуйте, Alexey Chen, Вы писали:


    AC>>>ИМХО, C++ и буст отнюдь не синонимы.

    E>>Пока.
    AC>Если в С++ ещё и буст втащить, то точно языку трындец будет.

    AC>Надеюсь что никогда такого не будут, за исключением реализации пары классов, которые к бусту имеют весьма посредственное отношение. Ну пользует он что-то похожее.


    Тот же BOOST++, на котором ув. апологет написал свой пример, к С++ вообще имеет слабое отношение. ИМХО, конечно Это другой язык, со своим синтаксисом и семантикой.

    Сравни:

    class name_t {};
    class value_t {};
    class weight_t {};
    
    void foo()
    {
        tagged_tuple<std::string, name_t, int, value_t> s;
        
        s.get<name_t>()   = "Hello World";
        s.get<value_t>()  = 2005;
    }


    и

    enum _n_Height  { n_Height };
    enum _n_Weight  { n_Weight };
    enum _n_Name    { n_Name };
    
    struct Fake_Struct { void operator []( Fake_Struct const& ); };
    
    template < class _Tx, class _Name, class _Super = Fake_Struct >
      struct Struct : _Super
        {
          using _Super::operator[];
    
          _Tx val_;
          _Tx& operator []( _Name n ) { return val_; }
    
          Struct() : val_(_Tx()) {}
        };
    
    typedef 
      Struct< int, _n_Height, Struct < float, _n_Weight, Struct < std::string, _n_Name > > >
      MyStruct;
    
    
    int main()
      {
    
        MyStruct s;
    
        s[n_Height]  = 10;
        s[n_Weight]  = 20.3;
        s[n_Name]    = "name";


    Еще вопросы есть? Тут еще надо посморить о красоте

    AC>На мой взгляд, до ужаса кривой и неудобный.

    У тебя просто Visual Assist X нет
    Re[14]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 11:27
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Так что я без всяких наездов, просто опыт перенять.


    Основные проблемы были с опечатками и неудобством использования специальных типов, например ос_string. Плюс дублирование работы при написании логировнани я и валидации.

    Собственно суть идеи, задание _языкового_ идентификатора, по которому можно удобно идентифицировать элемет структуры данных. Но не только его, а так же некую сопутствующую информацию определённую декларативно в виде трейтсов. Это может быть полезно для задания ограничений валидации, правил сериализации и логирования. Может ещё чего-то... Не знаю. А может быть это вообще плохая неинтересная и вообще вредная идея. Это всё зависит
    Re[12]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 11:33
    Оценка:
    Здравствуйте, Pavel Chikulaev, Вы писали:

    PC>Еще вопросы есть? Тут еще надо посморить о красоте

    Ээээ. Есть. Вы о чем уважаемый?

    AC>>На мой взгляд, до ужаса кривой и неудобный.

    PC>У тебя просто Visual Assist X нет
    Есть. Но такие простые примеры я обычно в фаре пишу. Впрочем, я вообще часто в фаре пишу и каких либо неудобств при этом не испытываю.
    Re[13]: Aka Tuple
    От: Pavel Chikulaev Россия  
    Дата: 27.06.05 11:40
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    AC>Здравствуйте, Pavel Chikulaev, Вы писали:


    PC>>Еще вопросы есть? Тут еще надо посморить о красоте

    AC>Ээээ. Есть. Вы о чем уважаемый?
    Эт у меня коряво? По-моему у тебя этого больше, плюс у меня повторное использование, проверка от ошибок, удобный синтаксис, а что у тебя?

    AC>>>На мой взгляд, до ужаса кривой и неудобный.

    PC>>У тебя просто Visual Assist X нет
    AC>Есть. Но такие простые примеры я обычно в фаре пишу. Впрочем, я вообще часто в фаре пишу и каких либо неудобств при этом не испытываю.
    Из Visual Assist X никуда не пойду — ни за что!!!
    Re[3]: Aka Tuple
    От: MaximE Великобритания  
    Дата: 27.06.05 12:59
    Оценка:
    uw wrote:

    []

    > ME>
  • Практическая применимость такого кортежа в шаблонном коде близка к абсолютному нулю. Ничего не стоит в compile time определить количество членов boost::tuple и проитерироваться по его членам, так как индексом его членов является целое, результаты арифметических операций над которым вычисляются в compile time. По приведенному кортежу невозможно проитерироваться в generic коде, так как нужно знать имена членов. Возвращемся к тому, что индексы должны быть простыми целыми.
    >
    > Бред. Или я чего то не понимаю, или это типичный симптом пользователя буста(судя по количеству согласившихся). В данном случае можно спокойно обращаться к членам структуры по индексу, выяснять их количество, итерироваться в compile time. Я потратил ровно две минуты, чтобы написать такой код:

    Действительно, именно итерироваться — элементарно. Я был не точен, random access к членам из generic кода невозможен, только перебор.

    --
    Maxim Yegorushkin
    Posted via RSDN NNTP Server 1.9
  • Re[4]: Aka Tuple
    От: Alexey Chen Чили  
    Дата: 27.06.05 14:38
    Оценка:
    Здравствуйте, MaximE, Вы писали:

    ME>Действительно, именно итерироваться — элементарно. Я был не точен, random access к членам из generic кода невозможен, только перебор.


    Нда. То есть в принципе невозможен, ну хоть ты тресни

    template < unsigned _No, class _Tx >
      struct valT 
        { typedef typename valT<_No-1,typename _Tx::_Next>::_Type _Type; };
    
    template<class _Tx> 
      struct valT<0,_Tx> 
        { typedef _Tx _Type; };
    
    template < unsigned _No, class _Tx >
      typename valT<_No,_Tx>::_Type::_Type& get(_Tx &x) 
        { 
          return static_cast<typename valT<_No,_Tx>::_Type&>(x).val_;
        }


    плюс в структуре два тайпдефа

    ...
    template < class _Tx, class _Name, class _Super = Fake_Struct >
      struct Struct : _Super
        {
          typedef _Super _Next;
          typedef _Tx    _Type;
    ...


    Только обьясните мне, непонятливому, как человек знающий (?) С++ и разбирающийся в бусте (?) может на автомате не понять как это сделать. И как опытный программист не понять почему нет смысла писать это в исходном топике?
    Re[5]: Aka Tuple
    От: MaximE Великобритания  
    Дата: 27.06.05 14:51
    Оценка:
    Alexey Chen wrote:

    > ME>Действительно, именно итерироваться — элементарно. Я был не точен, random access к членам из generic кода невозможен, только перебор.

    >
    > Нда. То есть в принципе невозможен, ну хоть ты тресни

    Сдаюсь — возможен

    --
    Maxim Yegorushkin
    Posted via RSDN NNTP Server 1.9
    Re[2]: Aka Tuple
    От: WoldemaR Россия  
    Дата: 27.06.05 16:26
    Оценка:
    Здравствуйте, Alexey Chen, Вы писали:

    [...]

    Идея просто супер!!! Особенно вторая.
    Как-то за непродуктивным флеймом народ проморгал существенную, на мой взгляд идею:
    TEGGO_SFIELD(iHeight, int);

    А точнее следующее её развитие:
    TEGGO_SFIELD(name, id, type, default);


    Ну чё, господа? Есть такое в бусте?
    Re[11]: Aka Tuple
    От: ssi Россия  
    Дата: 28.06.05 17:47
    Оценка:
    AC>При этом код, который пишет твою мапу, ещё должен иметь таблицу соответствия ключей и информации о теге и кодировании значения. Очень важным является вопрос где эта информация хранится и как ты добиваешся целостности.

    Тут будет кстати boost::multi_index
    Знающие не говорят, говорящие не знают. Лао Цзы
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.