Форум программистов, компьютерный форум CyberForum.ru

mpl проход по элементам - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 81, средняя оценка - 4.67
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
29.06.2011, 23:23     mpl проход по элементам #1
Пытался написать вывод элементов vector_c не через for_each. Не вышло. Кто подскажет как сие сделать наиболее удобно?

Пример вектора.

C++
1
typedef boost::mpl::vector_c<char, 'h', 'e', 'l', 'l', 'o'>::type vector;
Спасибо.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
30.06.2011, 17:23     mpl проход по элементам #2
как обычно, рекурсивно.
или что?
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
30.06.2011, 20:34  [ТС]     mpl проход по элементам #3
niXman, Желателен пример. Я так и не смог разобраться с проходом по элементам mpl::vector.
Через begin/end не втыкаю как. Через индексы тоже. А тем не менее жутко интересно.

И плюс хотелось бы увидеть пример как выполнить допустим такую задачку.

Написать тернарную метафункцию transform_types<x, y, c>, которая в типе x заменяет все вхождения типа c на тип y.

Пример.

C++
1
2
transform_types<int*, double, int>::type == double*;
transform_types<const int* const, float, int* const>::type == const float;
Через typetraits или mpl. Просто читаю книгу - хочется поймать нить, но как-то с метапрограммированием через mpl поладить быстро не удается.
Собственно код я не прошу соответственно, хочу просто узнать как такое делается - алгоритм грубо говоря. И какими средствами.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.07.2011, 05:59     mpl проход по элементам #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
кто-то из нас чего-то недопонял...
я уже написал, что это решается банальной рекурсией.
уточню: именно шаблонной рекурсией.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
04.07.2011, 18:27  [ТС]     mpl проход по элементам #5
niXman, Что-то вроде?

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
namespace mpl = boost::mpl;
 
 
template<class T, int N, int I = 0>
struct counter
{
    static const int value = mpl::at<T, mpl::int_<counter<T, N, I+1>::value>>::type::value;
    static constexpr int apply()
    {
        return counter<T, N, I>::value + counter<T, N, I + 1>::apply();
    }
};
 
template<class T, int N>
struct counter<T, N, N>
{
    static const int value = 0;
    static constexpr int apply()
    {
        return 0;
    }
};
 
template<class T>
int count(const T& val)
{
    return counter<T, mpl::size<T>::value>::apply();
}
 
int main()
{
    typedef mpl::vector_c<int, 1, 2, 3, 4, 5, 6, 7> vector_c;
    vector_c new_vec;
    std::cout << count(new_vec) << '\n';
}
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.07.2011, 18:43     mpl проход по элементам #6
да. вроде того.

Добавлено через 1 минуту
правда, вместо "static const int" я предпочитаю использовать enum. ибо он по умолчанию compile-time значение. и записывается короче.

Добавлено через 1 минуту
правда я не очень понял надобности писать mpl::for_each/fusion::for_each руками, ибо есть готовые. наверное спортивный интерес..
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
04.07.2011, 18:52  [ТС]     mpl проход по элементам #7
niXman, Подскажи еще плз. Каким макаром вывести в прямом порядке элементы вектора, а не в реверсе?

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
namespace mpl = boost::mpl;
 
 
template<class T, int N, int I = 0>
struct printer
{
    enum {value = mpl::at<T, mpl::int_<printer<T, N, I + 1>::value>>::type::value};
    static void apply()
    {
        std::cout << printer<T, N, I>::value << '\n';
        return printer<T, N, I + 1>::apply();
    }
};
 
template<class T, int N>
struct printer<T, N, N>
{
    enum {value = 0};
    static void apply()
    {
    }
};
 
template<class T>
void count(const T& val)
{
    printer<T, mpl::size<T>::value>::apply();
}
 
int main()
{
    typedef mpl::vector_c<int, 1, 2, 3, 4, 5, 6, 7, 8> vector_c;
    vector_c new_vec;
    count(new_vec);
}
Добавлено через 36 секунд
niXman, Да естественно исключительно спортивный интерес.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.07.2011, 18:58     mpl проход по элементам #8
тебе нужно твой printer задекларить для итераторов, а не для индексов. это дает больше свободы в действиях и больше возможностей.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename First, typename Last>
struct printer {
   // для доступа к следующему элементу используй mpl::next<>
 
   ...
};
template<typename Last>
struct printer<Last, Last> {
   ...
};
 
template<typename T>
void count(const T& v) {
   printer<
      mpl::begin<T>::type,
      mpl::end<T>::type
   >::apply();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2011, 19:36     mpl проход по элементам
Еще ссылки по теме:

Boost C++ MPL push_back
Boost C++ MPL упражнения из документации
Сумма во время компиляции, boost::mpl Boost C++
Достать mpl sequency из условия C++
Определить mpl последовательность C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
04.07.2011, 19:36  [ТС]     mpl проход по элементам #9
niXman, Ну да. Спасибо. Сейчас покурить выходил - как раз об этом подумал.

Добавлено через 24 минуты
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
template<class Cur_iter, class L_iter>
struct printer
{
    static void apply()
    {
        std::cout << mpl::deref<Cur_iter>::type::value << '\n';
        return printer<typename mpl::next<Cur_iter>::type, L_iter>::apply();
    }
};
 
template<class Iter>
struct printer<Iter, Iter>
{
    static void apply()
    {
        std::cout << "The end\n";
    }
};
 
template<class T>
void print(const T& sequence)
{
    printer<typename mpl::begin<T>::type, typename mpl::end<T>::type>::apply();
}
 
int main()
{
    mpl::vector_c<int, 1,2,3,4,5, 10, 25, 40> vec_c;
    print(vec_c);
}
Вышло как-то так. Попутно и с fusion::for_each разобрался. Спасибо, niXman.
Yandex
Объявления
04.07.2011, 19:36     mpl проход по элементам
Ответ Создать тему
Опции темы

Текущее время: 07:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru