Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > посчитать суммарный объем типов в mpl последовател


Автор: boostcoder 2.11.2010, 22:59
следующий код:
Код

#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/9aace7d47c127da63966779c1d120cdc
конкатенирует строки и создает последовательность типов. с этим все гуд.
тип 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/10849b82ecc54b1a63fe4f8a93c8fca8


спасибо.

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

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

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

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

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

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

это касательно заголовка пакета?
если да - то я так и предполагал это сделать.
а какие еще варианты?

Автор: mes 2.11.2010, 23:37
Цитата(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`у

Автор: boostcoder 2.11.2010, 23:42
я ведь работаю с 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

Автор: mes 2.11.2010, 23:47
Цитата(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/a94b55760e836c72303d528f32b76608

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)