В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
1

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

29.06.2011, 23:23. Показов 10733. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытался написать вывод элементов vector_c не через for_each. Не вышло. Кто подскажет как сие сделать наиболее удобно?

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

C++
1
typedef boost::mpl::vector_c<char, 'h', 'e', 'l', 'l', 'o'>::type vector;
Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2011, 23:23
Ответы с готовыми решениями:

CheckListBox автоматический проход по элементам
Друзья помогите как в компоненте CheckListBox снять все галочки с Items for(int i = 0; i &lt;...

Проход по элементам односвязного линейного списка
Допустим у меня существует класс линейного односвязного списка. Надо пройти по его элементам и...

Проход по элементам массива
Всем доброго времени суток! У меня сложилась такая вот дилемма. String qu= {&quot;Что тут?&quot;, &quot;А...

Проход по элементам списка
определить функцию ДОБАВЬ прибавляющую к элементам списка заданное число. (defun добавь (x y)...

8
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
30.06.2011, 17:23 2
как обычно, рекурсивно.
или что?
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.06.2011, 20:34  [ТС] 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 поладить быстро не удается.
Собственно код я не прошу соответственно, хочу просто узнать как такое делается - алгоритм грубо говоря. И какими средствами.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.07.2011, 05:59 4
Лучший ответ Сообщение было отмечено ForEveR как решение

Решение

кто-то из нас чего-то недопонял...
я уже написал, что это решается банальной рекурсией.
уточню: именно шаблонной рекурсией.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.07.2011, 18:27  [ТС] 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';
}
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.07.2011, 18:43 6
да. вроде того.

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

Добавлено через 1 минуту
правда я не очень понял надобности писать mpl::for_each/fusion::for_each руками, ибо есть готовые. наверное спортивный интерес..
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.07.2011, 18:52  [ТС] 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, Да естественно исключительно спортивный интерес.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.07.2011, 18:58 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();
}
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.07.2011, 19:36  [ТС] 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.
1
04.07.2011, 19:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2011, 19:36
Помогаю со студенческими работами здесь

Не идет проход по элементам списка
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;string.h&gt; #define N 100;...

Проход по всем элементам MenuStrip и NullReferenceException was unhandled
Добрый день! Сразу скажу, что в программировании я неселен. Для облегчения своей работы...

Проход по всем элементам некоторого типа объектов, расположенных на форме
Приветствую. Есть серия кнопок TSpeedButton на форме. Возможно-ли пройти циклом по ним (будто это...

[tasm] Как сделать проход по всем элементам ниже побочной диагонали матрицы
Добрый день(вечер). Использую тасм. Возникла небольшая проблема при написании кода. В общем ломаю...

Проход по элементам коллекции и ошибка "Индекс находился за пределами диапазона"
День добрый, у меня тут достаточно загадочная ситуация. нужна помощь. есть цикл, при помощи...

boost::mpl
Всем привет. Просьба поделиться какими-либо реальными примерами использования Boost :: MPL, чтобы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru