Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
tapochka
40 / 40 / 17
Регистрация: 25.04.2014
Сообщений: 499
1

Достать mpl sequency из условия

22.12.2015, 05:10. Просмотров 299. Ответов 2
Метки нет (Все метки)

здравствуйте, есть такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
template<typename seq>
struct get_symbols {
    typedef typename mpl::back<seq>::type symbol;
    typedef typename mpl::pop_back<seq>::type seq_;
};
 
template<typename seq, char symbol>
struct process {
    typedef typename get_symbols<seq>::symbol rhs;
    typedef typename get_symbols<typename get_symbols<seq>::seq_>::symbol lhs;
    typedef typename get_symbols<typename get_symbols<seq>::seq_>::seq_ exit_seq;
   
    typedef typename mpl::if_<boost::is_same<mpl::integral_c<char,symbol>, mpl::integral_c<char, '1'> >,
            mpl::push_back<exit_seq, mpl::integral_c<int, mpl::plus<lhs,
                                                                      rhs>::type::value>>::type,  //(1)
            mpl::push_back<exit_seq, mpl::integral_c<int, mpl::minus<lhs,
                                                                      rhs>::type::value>>::type  //(2)
              >::type if_c;      //тут две ошибки
};
 
int main() {
typedef boost::mpl::vector_c<int, 1, 2, 3>::type vec_int;
std::cout<<process<vec_int, '1'>::if_c::value<<std::endl; //вот тут ошибка
return 0;
}
хочется в дальнейшем коде использовать последовательности (1) и (2). помогите...

Добавлено через 26 минут
исправил ошибки в if
C++
1
2
3
4
5
6
7
8
9
10
template<typename seq, char symbol>
struct process {
    typedef typename get_symbols<seq>::symbol rhs;
    typedef typename get_symbols<typename get_symbols<seq>::seq_>::symbol lhs;
    typedef typename get_symbols<typename get_symbols<seq>::seq_>::seq_ exit_seq;
    typedef typename mpl::if_<boost::is_same<mpl::integral_c<char,symbol>, mpl::integral_c<char, '1'> >,
            mpl::push_back<exit_seq, mpl::integral_c<int, mpl::plus<lhs,rhs>::type::value>>,   //(1)
            mpl::push_back<exit_seq, mpl::integral_c<int, mpl::minus<lhs,rhs>::type::value>>  //(2)
            >::type if_c;
};
но использовать результаты (1) и (2) все равно не знаю как

Добавлено через 53 минуты
так, допустим, не срабатывает
C++
1
2
3
typedef boost::mpl::vector_c<int, 1, 2, 3>::type vec_int;
typedef process<vec_int, '1'>::if_c vec_dfs;
boost::mpl::for_each<vec_dfs>([](int a)-> void { std::cout<<a<<std::endl; });
Добавлено через 11 минут
мда... достаточно было написать так:
C++
1
boost::mpl::for_each<vec_dfs::[B]type[/B]>([](int a)-> void { std::cout<<a<<std::endl; });
и обращаться теперь можно так:
C++
1
typedef process<vec_int, '1'>::if_c::type vec_dfs;
и вороти дальше что хочешь...

Добавлено через 2 часа 48 минут
новая напасть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<typename seq, char symbol>
struct process
{
    typedef typename get_symbols<seq>::symbol rhs;
    typedef typename get_symbols<typename get_symbols<seq>::seq_>::symbol lhs;
    typedef typename get_symbols<typename get_symbols<seq>::seq_>::seq_ seq_;
    typedef typename mpl::if_<mpl::bool_<symbol=='1'>,
            mpl::push_back<seq_, mpl::integral_c<int, mpl::plus<lhs,rhs>::type::value>>,
            mpl::if_<mpl::bool_<symbol=='2'>,
                mpl::push_back<seq_, mpl::integral_c<int, mpl::minus<lhs,rhs>::type::value>>,
                mpl::if_<mpl::bool_<symbol=='3'>,
                    mpl::push_back<seq_, mpl::integral_c<int, mpl::multiplies<lhs,rhs>::type::value>>,
                        mpl::push_back<seq_, mpl::integral_c<int, mpl::multiplies<lhs,rhs>::type::value>>
                    >
                >
            >::type exit_seq;
};
int main() {
typedef process<vec_int, '2'>::exit_seq::type vec_dfs1;         //вылетает, мол, exit_seq только для '1'
boost::mpl::for_each<vec_dfs1>([](int a)-> void { std::cout<<a<<std::endl; });
}
помогите как сделать вложенный if_

Добавлено через 2 часа 16 минут
хм... достаточно было сделать так(для всех нужных значений symbol):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template<typename seq>
struct process_impl {
    typedef typename get_symbols<seq>::symbol rhs;
    typedef typename get_symbols<typename get_symbols<seq>::seq_>::symbol lhs;
    typedef typename get_symbols<typename get_symbols<seq>::seq_>::seq_ seq_;
};
 
template<typename seq, char symbol>
struct process {};
 
template<typename seq, char symbol>
struct process<seq, typename boost::enable_if< boost::is_same<mpl::char_<symbol>,
                                                                mpl::char_<'1'>>                     //тут ошибка одна
        >::type> : process_impl<seq> {
    typedef mpl::push_back<seq_, mpl::integral_c<int, mpl::plus<lhs,rhs>::type::value>>::type exit_seq;
};
 
template<typename seq, char symbol>
struct process<seq, typename boost::enable_if< boost::is_same<mpl::char_<symbol>,
                                                                mpl::char_<'2'>>                   //тут ошибка одна
        >::type> : process_impl<seq> {
    typedef mpl::push_back<seq_, mpl::integral_c<int, mpl::minus<lhs,rhs>::type::value>>::type exit_seq;
};
помогите ошибки исправить, а то никак въехать не могу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2015, 05:10
Ответы с готовыми решениями:

Определить mpl последовательность
здравствуйте, помогите допилить mpl-sequence до юзабельного состояния, за...

mpl проход по элементам
Пытался написать вывод элементов vector_c не через for_each. Не вышло. Кто...

Получить индекс типа в mpl::map`е
всем привет. есть mpl карта типов(key -&gt; value). нужно получить индекс типа...

tmp with mpl
я в ран тайме заполняю массив числами фибоначи до 10000 элемента...можно ли...

MPL push_back
А как тут push_back пользоваться?#include &lt;iostream&gt; #include &lt;type_traits&gt;...

2
DrOffset
8137 / 4719 / 1153
Регистрация: 30.01.2014
Сообщений: 7,690
22.12.2015, 08:49 2
Цитата Сообщение от tapochka Посмотреть сообщение
помогите ошибки исправить
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <boost/mpl/push_back.hpp>
#include <boost/mpl/pop_back.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/char.hpp>
#include <boost/mpl/back.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/utility/enable_if.hpp>
 
#include <boost/type_traits.hpp>
 
#include <iostream>
 
namespace mpl = boost::mpl;
 
template<typename seq>
struct get_symbols {
    typedef typename mpl::back<seq>::type symbol;
    typedef typename mpl::pop_back<seq>::type seq_;
};
 
template<typename seq>
struct process_impl {
    typedef typename get_symbols<seq>::symbol rhs;
    typedef typename get_symbols<typename get_symbols<seq>::seq_>::symbol lhs;
    typedef typename get_symbols<typename get_symbols<seq>::seq_>::seq_ seq_;
};
 
template<typename seq, char symbol, typename = void> //!
struct process {};
 
template<typename seq, char symbol>
struct process<seq, symbol, typename boost::enable_if_c<(symbol == '1')>::type> //! 1!
    : process_impl<seq>
{
    using typename process_impl<seq>::lhs;  //!
    using typename process_impl<seq>::rhs;
    using typename process_impl<seq>::seq_;
 
    typedef typename mpl::push_back<seq_ //!
                , mpl::integral_c<int, mpl::plus<lhs,rhs>::type::value>
            >::type exit_seq;
};
 
template<typename seq, char symbol>
struct process<seq, symbol, typename boost::enable_if_c<(symbol == '2')>::type> //! 2!
    : process_impl<seq>
{
    using typename process_impl<seq>::lhs;   //!
    using typename process_impl<seq>::rhs;
    using typename process_impl<seq>::seq_;
 
    typedef typename mpl::push_back<seq_ //!
                , mpl::integral_c<int, mpl::minus<lhs,rhs>::type::value>
            >::type exit_seq;
};
 
int main()
{
    typedef boost::mpl::vector_c<int, 1, 2, 3>::type vec_int;
 
    typedef process<vec_int, '2'>::exit_seq::type vec_dfs1;        
    boost::mpl::for_each<vec_dfs1>([](int a)-> void { std::cout<<a<<std::endl; });
}

Разбирай тему зависимых имен шабонов, если хочешь в дальнейшем самостоятельно справляться с такими ошибками.
Где было 1 и 2 - переусложнил сильно. Можно было сразу сравнить символы. Плюс похоже ускользает детальное понимание того что такое enable_if. У тебя там получалась абсурдная ситуация, что основной шаблон принимает char вторым аргументом, а в специализации ты туда подставляешь тип.

Кроме всего прочего, хочу предупредить, что злоупотребление такими конструкциями в промышленном коде чревато (возможности его использования сильно зависят от команды и правил кодирования в компании), поэтому всегда держи в голове, что подобный код скорее всего придется выкидывать.
4
tapochka
40 / 40 / 17
Регистрация: 25.04.2014
Сообщений: 499
22.12.2015, 22:10  [ТС] 3
Цитата Сообщение от DrOffset Посмотреть сообщение
Где было 1 и 2 - переусложнил сильно
да вот нагуглил просто:
https://crazycpp.wordpress.com/2011/02/16/28/
https://christopherschwaab.wordpress...atements-in-c/
вторую вообще не осилил ссылку, решил делать как в первой в самом легком случае

Цитата Сообщение от DrOffset Посмотреть сообщение
Кроме всего прочего, хочу предупредить, что злоупотребление такими конструкциями в промышленном коде чревато (возможности его использования сильно зависят от команды и правил кодирования в компании), поэтому всегда держи в голове, что подобный код скорее всего придется выкидывать.
это уж на своей шкуре прочувствовалось) к сожалению
но дома то ничто не мешает извращаться вдоволь
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2015, 22:10

split mpl::boost
Реализация compile-time алгоритма split для строки. Так как оставлять сообщения...

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

boost::mpl и метапрограммирование вцелом
Сейчас сижу любуюсь на mpl::vector. template&lt; typename T0, typename...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru