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


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

#include <iostream>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/string.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/push_back.hpp>

typedef boost::mpl::vector<
   boost::mpl::char_<'a'>,
   boost::mpl::char_<'b'>,
   boost::mpl::char_<'c'>
> slist;

typedef boost::mpl::fold<
   slist,
   boost::mpl::string<>,
   boost::mpl::push_back<boost::mpl::_1, boost::mpl::_2>
>::type string;

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


http://liveworkspace.org/code/41511b3d5ba914ba40b08445a753b5f5
работает как надо.

но если его изменить так:
Код

#include <iostream>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/string.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/push_back.hpp>

typedef boost::mpl::vector<
   boost::mpl::string<'ab'>,
   boost::mpl::string<'cd'>,
   boost::mpl::string<'ef'>
> slist;

typedef boost::mpl::fold<
   slist,
   boost::mpl::string<>,
   boost::mpl::push_back<boost::mpl::_1, boost::mpl::_2>
>::type string;

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


http://liveworkspace.org/code/16fa2f9bde5780b6f8d29931dfef7cb6
то получаю кучу ошибок.

вопрос в том, как можно конкатенировать массив mpl строк?

спасибо.

Автор: mes 2.11.2010, 16:14
потому что пытаетесь сделать push_back<string, string>,
а string в отличие от char_ явлется seq, a не value.. 
a push_back напрямую последовательности не складывает..

Добавлено через 1 минуту и 40 секунд
это я так понимаю Вы к строке формата перешли ? 

Автор: rudvil 2.11.2010, 16:31
Цитата(boostcoder @  2.11.2010,  15:05 Найти цитируемый пост)
то получаю кучу ошибок.

Разве в одинарных кавычках можно писать более одного символа? помоему нет.

Автор: mes 2.11.2010, 16:44
Цитата(rudvil @  2.11.2010,  15:31 Найти цитируемый пост)
Разве в одинарных кавычках можно писать более одного символа? помоему нет. 

Цитата

A character literal is one or more characters enclosed in single quotes, as in ’x’, optionally preceded by
the letter L, as in L’x’. A character literal that does not begin with L is an ordinary character literal, also
referred to as a narrow-character literal. An ordinary character literal that contains a single c-char has type
char, with value equal to the numerical value of the encoding of the c-char in the execution character set.
An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter
literal has type int and implementation-defined value
.

Автор: boostcoder 2.11.2010, 16:48
Цитата(mes @  2.11.2010,  16:14 Найти цитируемый пост)
потому что пытаетесь сделать push_back<string, string>,
а string в отличие от char_ явлется seq, a не value.. 
a push_back напрямую последовательности не складывает..

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

вопрос закрыт..

Добавлено через 55 секунд
Цитата(mes @  2.11.2010,  16:14 Найти цитируемый пост)
это я так понимаю Вы к строке формата перешли ?  

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

Добавлено через 2 минуты и 19 секунд
Цитата(rudvil @ 2.11.2010,  16:31)
Цитата(boostcoder @  2.11.2010,  15:05 Найти цитируемый пост)
то получаю кучу ошибок.

Разве в одинарных кавычках можно писать более одного символа? помоему нет.

угу.
можно записать и так:
Код

boost::mpl::char_<'abc'>

но в действительности будет использован только последний символ.

Добавлено через 3 минуты и 48 секунд
Цитата(boostcoder @  2.11.2010,  16:48 Найти цитируемый пост)
вопрос закрыт..

т.е. нет, не закрыт.
какие способы решения есть?

Автор: mes 2.11.2010, 17:00
Цитата(boostcoder @  2.11.2010,  15:48 Найти цитируемый пост)
какие способы решения есть? 

использовать вместо push_back другой алгоритм smile какой не знаю smile
по идеи  copy должен помочь..

Добавлено через 56 секунд
Цитата(boostcoder @  2.11.2010,  15:48 Найти цитируемый пост)
ага.
что-то мне очень хочется реализовать это препроцессором. результат тот же, а времязатраты меньше.

а все остальное уже работает ? что Вы к завершающим штрихам перешли ?

Автор: boostcoder 2.11.2010, 17:02
Цитата(mes @  2.11.2010,  17:00 Найти цитируемый пост)
по идеи  copy должен помочь..  

попробую..

Автор: boostcoder 2.11.2010, 18:28
Цитата(mes @  2.11.2010,  17:00 Найти цитируемый пост)
по идеи  copy должен помочь..

вы снова правы smile 
Код

#include <iostream>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/string.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/push_back.hpp>

typedef boost::mpl::vector<
   boost::mpl::string<'ab'>,
   boost::mpl::string<'cd'>,
   boost::mpl::string<'ef'>
> slist;

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

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


http://liveworkspace.org/code/0055a2e48b523039eb5b3d939bc47f87

вопрос закрыт.

Автор: mes 2.11.2010, 18:38
Цитата(boostcoder @  2.11.2010,  15:48 Найти цитируемый пост)
но в действительности будет использован только последний символ.

это опять "случайность", связанная с разрядностью.. будет использован остатка от деления на  (чар_мах+1), который равен последнему символу.. 
smile

Добавлено @ 18:38
Цитата(boostcoder @  2.11.2010,  17:28 Найти цитируемый пост)
вы снова правы 

уряя  smile 

Автор: boostcoder 2.11.2010, 18:39
Цитата(mes @  2.11.2010,  18:38 Найти цитируемый пост)
будет использован остаок от деления на  (чар_мах+1), который равен последнему символу.. 

о как!


зы
вам череп не жмёт? smile 

Автор: mes 2.11.2010, 18:42
Цитата(boostcoder @  2.11.2010,  17:39 Найти цитируемый пост)
о как!

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

Добавлено @ 18:45
Цитата(boostcoder @  2.11.2010,  17:39 Найти цитируемый пост)
Вам череп не жмёт? 

зря Вы так.. я всего лишь новичок.. и знаний не так много.. 
к бусту фактически впервые прикоснулся только в этом месяце.. 


а так меня просто спасает интуиция  smile 

Автор: boostcoder 2.11.2010, 18:53
Цитата(mes @  2.11.2010,  18:42 Найти цитируемый пост)
хотелось бы подчеркнуть.. что самой операции, взятие деления тоже не будет.. это просто следствие переполнения..

 smile 

Цитата(mes @  2.11.2010,  18:42 Найти цитируемый пост)
я всего лишь новичок..

значит я зародыш smile 

Автор: mes 2.11.2010, 20:15
Цитата(boostcoder @  2.11.2010,  17:53 Найти цитируемый пост)
  smile  

http://liveworkspace.org/code/8940c23611e76d3345b357b59f732f39

"использован последний символ" - 2я строка вывода
"остаток от деления " - 3я строка вывода
"результат переполнения при приведении"  - 4я строка вывода (<- имелось ввиду это)
"наложение маски по and" - 5я строка вывода
smile

все приведенные строчки дают одинаковый результат, но это все частный случай из за особенностей архитектуры (т.е. так называемое "случайно")..

 

Автор: boostcoder 2.11.2010, 21:37
Цитата(mes @  2.11.2010,  20:15 Найти цитируемый пост)
http://liveworkspace.org/code/8940c23611e7...5b357b59f732f39

"использован последний символ" - 2я строка вывода
"остаток от деления " - 3я строка вывода
"результат переполнения при приведении"  - 4я строка вывода (<- имелось ввиду это)
"наложение маски по and" - 5я строка вывода

забавно smile 

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