Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование тьюпл как общей сущности взамен стру, ктур 
V
    Опции темы
djamshud
Дата 15.9.2010, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



azesmcar, кортеж - это ж по-европейски! :)

Если речь была про использование кортежа на все случаи жизни как полная замена структур, считаю это глупостью.

Это сообщение отредактировал(а) djamshud - 15.9.2010, 20:32


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 15.9.2010, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(djamshud @  15.9.2010,  20:30 Найти цитируемый пост)
azesmcar, кортеж - это ж по-европейски! smile

да уж..и не слышал такого термина smile

PM   Вверх
mes
Дата 15.9.2010, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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



Это сообщение отредактировал(а) mes - 15.9.2010, 22:30


--------------------
PM MAIL WWW   Вверх
bsa
Дата 15.9.2010, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(boostcoder @  15.9.2010,  19:11 Найти цитируемый пост)
посмотрите на великолепное творение - boost.fusion. воистину великолепное

Я пока еще не придумал, зачем мне это нужно. Возможно, конечно, что я не понял всех прелестей этой библиотеки, но идея вектора, состоящего из данных разных типов, задаваемых на этапе компиляции, кажется мне несколько надуманной. Если мне нужен контейнер для любых данных, я использую boost::any, а если Variant, то я использую свою реализацию (а не бустовскую, непонятно зачем вообще сделанную), которая поддерживает преобразование в требуемый тип (в моем случае, требуется только совместимость его с istream/ostream).
PM   Вверх
boostcoder
Дата 16.9.2010, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



boost.fusion - это, преимущественно, компайл-тайм библиотека(mpl). но в отличии от boost.mpl, она помогает связывать компайл-тайм код с ран-тайм кодом, и предоставляет контейнеры и алгоритмы времени компиляции.

Цитата(bsa @  15.9.2010,  23:48 Найти цитируемый пост)
я использую boost::any

1. этим, вы теряете всю информацию о типе. и ни о каком mpl говорить неуместно.
2. зачем вам тратить процессорное время, на каст туда-обратно. при том, что в момент компиляции, компилятор многое может сделать сам, и "разгрузить" процессор от ненужного ему занятия.

Цитата(bsa @  15.9.2010,  23:48 Найти цитируемый пост)
 а если Variant, то я использую свою реализацию (а не бустовскую, непонятно зачем вообще сделанную)

variant и any - ран-тайм классы. сплошной оверхед. именно по этой причине, в последнее время, интенсивно применяется mpl.
если не секрет, чем ваша реализация лучше boost.variant? и чем не утраивает boost.variant? просто любопытно.

Добавлено @ 00:39
тема-то не об этом...

Это сообщение отредактировал(а) boostcoder - 27.7.2011, 10:40
PM WWW   Вверх
bsa
Дата 16.9.2010, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(boostcoder @  16.9.2010,  01:31 Найти цитируемый пост)
чем ваша реализация лучше boost.variant? и чем не утраивает boost.variant?

 smile У каждого класса есть сигналы/слоты. В качестве параметров они принимают разные типы (int, double, string...). Чтобы стандартизировать интерфейсы я использовал свою версию варианта. В большинстве случаев (во время работы) используется передача данных напрямую (т.е. если слот принимает int, то и отправляется ему int), но на этапе инициализации все идет через string (так как все записано в xml). Чтобы не плодить разные интерфейсы, мной было сделано именно так.

Это сообщение отредактировал(а) bsa - 16.9.2010, 11:08
PM   Вверх
boostcoder
Дата 6.10.2010, 20:45 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



задача решена, проверенна, и мега удобна!
собственно приоткрою истинную цель задумки.
по роду деятельности, часто приходится работать с протоколами/создавать протоколы обмена.
что для этого нужно? :
1. куча структур.
2. куча парсеров байт-массивов.

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

решил задачу, путем написания препроцессорного метагенератора.
и так...
в нашем проекте нам потребуется файл, в котором мы будем typedef`ить наши типы. назовем его "typedefs.hpp".
Код

#ifndef TYPEDEFS_HPP_INCLUDED
#define TYPEDEFS_HPP_INCLUDED

#include "tuple_metagen_start.hpp"

/***************************************************************************/

DECLARE_TUPLES(
   ((room_t,
      ((std::string, name))
      ((std::vector<std::string>, inbound))
   ))
   ((type1,
      ((std::size_t, size))
      ((std::string, message))
   ))
   ((type2,
      ((std::string, string))
      ((std::string, code))
      ((std::string, message))
   ))
   ((type3,
      ((int, from))
      ((int, to))
      ((room_t, inbound))
   ))
)

/***************************************************************************/

#include "tuple_metagen_finish.hpp"

#endif // TYPEDEFS_HPP_INCLUDED


в результате, препроцессор сгенерирует такой код:
Код

struct room_t: boost::fusion::tuple< std::string, std::vector<std::string> > {
   room_t() {}
   room_t(const room_t& o)
      :boost::fusion::tuple< std::string, std::vector<std::string> >(o)
   {}
   room_t( const std::string & a0 , const std::vector<std::string> & a1 )
      :boost::fusion::tuple< std::string, std::vector<std::string> >( a0 , a1 )
   {}

   // вспомогательные методы
   enum { id = 0 }; // для метакода. инкрементируется метагенератором.
   static const char* name() { return "room_t"; }
   static int count() { return 2; }
   static const char** methods() {
      static const char* names[] = { "name" , "inbound" , 0 };
      return names;
   }

   // accessors
   void name (const std::string & v) { boost::fusion::get<0>(*this) = v; }
   const std::string& name () const { return boost::fusion::get<0>(*this); }
   void inbound (const std::vector<std::string> & v) { boost::fusion::get<1>(*this) = v; }
   const std::vector<std::string>& inbound () const { return boost::fusion::get<1>(*this); }

private:
   friend class boost::serialization::access;
   template<typename archive_type>
   void serialize(archive_type& ar, const unsigned int) {
      ar & boost::fusion::get<0>(*this)
         & boost::fusion::get<1>(*this) ;
   }
};

struct type1: boost::fusion::tuple< std::size_t, std::string > {
   type1() {}
   type1(const type1& o)
      :boost::fusion::tuple< std::size_t, std::string>(o)
   {}
   type1( const std::size_t & a0 , const std::string & a1 )
      :boost::fusion::tuple< std::size_t, std::string >( a0 , a1 )
   {}

   // вспомогательные методы
   enum { id = 1 }; // для метакода. инкрементируется метагенератором.
   static const char* name() { return "type1"; }
   static int count() { return 2; }
   static const char** methods() {
      static const char* names[] = { "size" , "message" , 0 };
      return names;
   }

   // accessors
   void size (const std::size_t & v) { boost::fusion::get<0>(*this) = v; }
   const std::size_t& size () const { return boost::fusion::get<0>(*this); }
   void message (const std::string & v) { boost::fusion::get<1>(*this) = v; }
   const std::string& message () const { return boost::fusion::get<1>(*this); }

private:
   friend class boost::serialization::access;
   template<typename archive_type>
   void serialize(archive_type& ar, const unsigned int) {
      ar & boost::fusion::get<0>(*this)
         & boost::fusion::get<1>(*this) ;
   }
};

struct type2: boost::fusion::tuple< std::string, std::string, std::string > {
   type2() {}
   type2(const type2& o)
      :boost::fusion::tuple< std::string, std::string, std::string>(o)
   {}
   type2( const std::string & a0 , const std::string & a1 , const std::string & a2 )
      :boost::fusion::tuple< std::string, std::string, std::string >( a0 , a1 , a2 )
   {}

   // вспомогательные методы
   enum { id = 2 }; // для метакода. инкрементируется метагенератором.
   static const char* name() { return "type2"; }
   static int count() { return 3; }
   static const char** methods() {
      static const char* names[] = { "string" , "code" , "message" , 0 };
      return names;
   }

   // accessors
   void string (const std::string & v) { boost::fusion::get<0>(*this) = v; }
   const std::string& string () const { return boost::fusion::get<0>(*this); }
   void code (const std::string & v) { boost::fusion::get<1>(*this) = v; }
   const std::string& code () const { return boost::fusion::get<1>(*this); }
   void message (const std::string & v) { boost::fusion::get<2>(*this) = v; }
   const std::string& message () const { return boost::fusion::get<2>(*this); }

private:
   friend class boost::serialization::access;
   template<typename archive_type>
   void serialize(archive_type& ar, const unsigned int) {
      ar & boost::fusion::get<0>(*this)
         & boost::fusion::get<1>(*this)
         & boost::fusion::get<2>(*this) ;
   }
};

struct type3: boost::fusion::tuple< int, int, room_t > {
   type3() {}
   type3(const type3& o)
      :boost::fusion::tuple< int, int, room_t>(o)
   {}
   type3( const int & a0 , const int & a1 , const room_t & a2 )
      :boost::fusion::tuple< int, int, room_t >( a0 , a1 , a2 )
   {}

   // вспомогательные методы
   enum { id = 3 }; // для метакода. инкрементируется метагенератором.
   static const char* name() { return "type3"; }
   static int count() { return 3; }
   static const char** methods() {
      static const char* names[] = { "from" , "to" , "inbound" , 0 };
      return names;
   }

   // accessors
   void from (const int & v) { boost::fusion::get<0>(*this) = v; }
   const int& from () const { return boost::fusion::get<0>(*this); }
   void to (const int & v) { boost::fusion::get<1>(*this) = v; }
   const int& to () const { return boost::fusion::get<1>(*this); }
   void inbound (const room_t & v) { boost::fusion::get<2>(*this) = v; }
   const room_t& inbound () const { return boost::fusion::get<2>(*this); }

private:
   friend class boost::serialization::access;
   template<typename archive_type>
   void serialize(archive_type& ar, const unsigned int) {
      ar & boost::fusion::get<0>(*this)
         & boost::fusion::get<1>(*this)
         & boost::fusion::get<2>(*this) ;
   }
};



использовать так:
Код


#include <iostream>
#include <boost/fusion/algorithm/iteration/for_each.hpp>
#include <boost/fusion/include/for_each.hpp>

#include "typedefs.hpp"

template<typename T>
struct printer {
   void operator()(const T& v) const {
      std::cout << v << std::endl;
   }
};

int main() {
   room_t room("room1", {"11", "foo", "anyfoo"});
   type1 t1(32, "any message...");
   type2 t2("string", "code", "message...");
   type3 t3(105, 107, room);

   // сериализуем
   {  boost::archive::text_oarchive(std::cout) << t3;
      std::cout << std::endl;
   }

   // алгоритмы boost.fusion
   boost::fusion::for_each(
      t2,
      printer<std::string>()
   );
   
   return 0;
}


надеюсь оцените мой труд smile 

зы
файлы во вложении.


Это сообщение отредактировал(а) boostcoder - 8.10.2010, 10:14

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  metagen.tar.gz 2,11 Kb
PM WWW   Вверх
bsa
Дата 6.5.2011, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



boostcoder, не думал предложить включить это в boost? Может, тебе еще какие интересные идеи по оптимизации предложили бы?
PM   Вверх
boostcoder
Дата 6.5.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(bsa @  6.5.2011,  20:10 Найти цитируемый пост)
не думал предложить включить это в boost?

нет)
к сожалению, мой уровень кода сильно недотягивает то уровня кода тех прогеров, чей код включили в буст. посему, даже предлагать это стыдно. мне еще учиться и учиться.. smile 

зы
на днях дополню кодогенератор так, чтоб в сгенеренных типах методы name()/count()/methods() были constexpr. это позволит использовать сгенеренные типы совместно с mpl контейнерами.

PM WWW   Вверх
mes
Дата 6.5.2011, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  6.5.2011,  19:52 Найти цитируемый пост)
 чтоб в сгенеренных типах методы name()/count()/methods() были constexpr

a еще, имхо, неплохо было бы их вынести за пределы пользовательского (генерируемого) класса...
как впрочем и метагенериацию не мешало бы разделить на "слои".. 





--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 6.5.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  6.5.2011,  21:30 Найти цитируемый пост)
вынести за пределы пользовательского (генерируемого) класса...

не понял...
все равно ведь никто не будет копашиться в сгенерированном коде.. смысл в чем?

Цитата(mes @  6.5.2011,  21:30 Найти цитируемый пост)
разделить на "слои"

тоже не понял..

Добавлено через 4 минуты и 34 секунды
у меня, оказывается локальная версия изменилась с тех пор..
сейчас, вспомогательные методы начинаются с подчерка. это я сделал для того, чтоб не пересекаться с пользовательскими методами..

по поводу использования совместно с mpl-контейнерами - это пихать сгенеренне типы в mpl::map. где ключем будет id типа, а значением сам тип. в таком случае, этот map можно и самому генерить, чтоб юзера разгрузить..

PM WWW   Вверх
boostcoder
Дата 6.5.2011, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



не знаю...стОит ли добавлять constexpr?
id - все равно enum.

т.е. такой код возможен:
Код

template<typename T>
struct item: boost::mpl::pair<boost::mpl::int_<T::_id>, T> {};

typedef boost::mpl::map<
   item<room_t>,
   item<type1>,
   item<type2>,
   item<type3>
> types_map;



добавил генерацию operator<< () в поток.


Это сообщение отредактировал(а) boostcoder - 6.5.2011, 22:33
PM WWW   Вверх
bsa
Дата 6.5.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



boostcoder, думаю, если ты сможешь добиться исключения явного подключения финишного хидера, то можешь смело отправлять в буст. Даже если тебя пошлют, то дадут ряд советов, как сделать так, чтобы не послали.

PM   Вверх
mes
Дата 6.5.2011, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  6.5.2011,  20:44 Найти цитируемый пост)
 смысл в чем?

1. будет удобней искать ошибку
2. большая защита коллизий
3. шаг к рантайм-типу
4. шире простор деятельности.. 
5.. 
в общем эта куча на меня производит негативное впечатление, и я много много раз подумал бы, чтоб начать использовать подобное..

Добавлено через 1 минуту и 13 секунд
Цитата(bsa @  6.5.2011,  21:56 Найти цитируемый пост)
то можешь смело отправлять в буст

а в бусте то оно зачем ?!



--------------------
PM MAIL WWW   Вверх
mes
Дата 6.5.2011, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(mes @  6.5.2011,  22:01 Найти цитируемый пост)
5.. 

вынести лишнее в cpp..

вот первый набросок , на основе результативной структуры room_t : http://liveworkspace.org/code/853f1fea8e52...d6a735a7b46a261


--------------------
PM MAIL WWW   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0650 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.