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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> посчитать суммарный объем типов в mpl последовател, ьности 
V
    Опции темы
boostcoder
Дата 2.11.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



следующий код:
Код

#include <iostream>
#include <typeinfo>
#include <boost/cstdint.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/string.hpp>
#include <boost/mpl/pair.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/reverse_fold.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/for_each.hpp>

typedef boost::mpl::vector<
   boost::mpl::pair<
      boost::uint16_t,
      boost::mpl::string<'a'>
   >,
   boost::mpl::pair<
      boost::uint32_t,
      boost::mpl::string<'b'>
   >,
   boost::mpl::pair<
      char[6],
      boost::mpl::string<'c'>
   >,
   boost::mpl::pair<
      char[10],
      boost::mpl::string<'d'>
   >
> types;

typedef boost::mpl::reverse_fold<
   types,
   boost::mpl::string<>,
   boost::mpl::copy<
      boost::mpl::_1,
      boost::mpl::back_inserter<
         boost::mpl::second<boost::mpl::_2>
      >
   >
>::type string;

typedef boost::mpl::fold<
   types,
   boost::mpl::vector<>,
   boost::mpl::push_back<
      boost::mpl::_1,
      boost::mpl::first<boost::mpl::_2>
   >
>::type typesvec;

int main() {
   std::cout << sizeof(boost::mpl::at_c<typesvec, 3>::type) << std::endl;
   std::cout << boost::mpl::c_str<string>::value << std::endl;
}

http://liveworkspace.org/code/9aace7d47c12...966779c1d120cdc
конкатенирует строки и создает последовательность типов. с этим все гуд.
тип typesvec вывел для упрощения понимания.
теперь, при попытке применить ко всем типам в последовательности оператор sizeof(), получаю 4. т.е. по все видимости, кол-во типов в контейнере.
в чем затык?
вот код:
Код

#include <iostream>
#include <typeinfo>
#include <boost/cstdint.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/string.hpp>
#include <boost/mpl/pair.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/reverse_fold.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/plus.hpp>
#include <boost/mpl/arithmetic.hpp>

typedef boost::mpl::vector<
   boost::mpl::pair<
      boost::uint16_t,
      boost::mpl::string<'a'>
   >,
   boost::mpl::pair<
      boost::uint32_t,
      boost::mpl::string<'b'>
   >,
   boost::mpl::pair<
      char[6],
      boost::mpl::string<'c'>
   >,
   boost::mpl::pair<
      char[10],
      boost::mpl::string<'d'>
   >
> types;

typedef boost::mpl::reverse_fold<
   types,
   boost::mpl::string<>,
   boost::mpl::copy<
      boost::mpl::_1,
      boost::mpl::back_inserter<
         boost::mpl::second<boost::mpl::_2>
      >
   >
>::type string;

typedef boost::mpl::fold<
   types,
   boost::mpl::vector<>,
   boost::mpl::push_back<
      boost::mpl::_1,
      boost::mpl::first<boost::mpl::_2>
   >
>::type typesvec;

typedef boost::mpl::fold<
   typesvec,
   boost::mpl::int_<0>,
   boost::mpl::plus<
      boost::mpl::_1,
      boost::mpl::int_<sizeof(boost::mpl::_2)>
   >
>::type summ;

int main() {
   std::cout << summ::value << std::endl;
   std::cout << boost::mpl::c_str<string>::value << std::endl;
}


http://liveworkspace.org/code/10849b82ecc5...3fe4f8a93c8fca8


спасибо.

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


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


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

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



Цитата(boostcoder @  2.11.2010,  21:59 Найти цитируемый пост)
 т.е. по все видимости, кол-во типов в контейнере.

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

у вас не структура данных, а набор типов.. 
smile


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


pattern`щик
****


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

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



Цитата(mes @  2.11.2010,  23:30 Найти цитируемый пост)
размер каждого типа равен 1

почему? у меня ведь нет таких типов в последовательности.

Цитата(mes @  2.11.2010,  23:30 Найти цитируемый пост)
у вас не структура данных, а набор типов.. 

это касательно заголовка пакета?
если да - то я так и предполагал это сделать.
а какие еще варианты?
PM WWW   Вверх
mes
Дата 2.11.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  2.11.2010,  22:33 Найти цитируемый пост)
почему? у меня ведь нет таких типов в последовательности.


sizeof (pair<char[10], int>) ==1
sizeof (pair<char[8], int>::first) ==8
smile

Добавлено через 2 минуты и 46 секунд
Цитата(boostcoder @  2.11.2010,  22:33 Найти цитируемый пост)
а какие еще варианты? 

складывать по first`у


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


pattern`щик
****


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

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



я ведь работаю с typesvec. а это вектор типов, а не вектор пар, как types.
в добавок, если записать такое:
Код

   std::cout << sizeof(boost::mpl::at_c<typesvec, 3>::type) << std::endl;

то я получу 10. чему и равен sizeof(char[10])

Добавлено через 1 минуту и 18 секунд
Цитата(mes @  2.11.2010,  23:37 Найти цитируемый пост)
складывать по first`у 

в typesvec и так все сложено по first

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


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


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

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



Цитата(boostcoder @  2.11.2010,  22:42 Найти цитируемый пост)
 с typesvec. а это вектор типов, а не вектор пар, как types.

нда невнимательно посмотрел... только вверх и низ  smile
не надо было лишнее выкладывать  smile  

Ловите: 
Код

typedef boost::mpl::fold<
   typesvec,
   boost::mpl::int_<0>,
   boost::mpl::plus<
      boost::mpl::_1,
      boost::mpl::sizeof_<boost::mpl::_2>
   >
>::type summ;


http://liveworkspace.org/code/a94b55760e83...03d528f32b76608

Это сообщение отредактировал(а) mes - 3.11.2010, 00:07


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


pattern`щик
****


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

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



Цитата(mes @  2.11.2010,  23:47 Найти цитируемый пост)
boost::mpl::sizeof_

это же надо быть таким кривоглазым smile выискивал же его.

Добавлено через 33 секунды
спасибо.
вопрос закрыт.

PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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