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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 81, средняя оценка - 4.67
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
#1

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

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

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

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

C++
1
typedef boost::mpl::vector_c<char, 'h', 'e', 'l', 'l', 'o'>::type vector;
Спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2011, 23:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос mpl проход по элементам (C++):

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

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

Как запретить компоненту проход через компонент? - C++ Builder
Давно интересовал вопрос : Как запретить компоненту проход через компонент?

Многопоточный проход по матрице - C++ WinAPI
Доброго времени суток! Пишу программу, которая с помощью 3-х (к примеру) потоков берет по 3 ряда матрицы и находит в каждом большее...

Проход по директориям (показывает точки) - C++ WinAPI
Объясните почему не показывает папки по адресу D:\\OOP ? WIN32_FIND_DATA wf; wchar_t *pStr = L&quot;D:\\OOP\\*.*&quot;, sTryPath =...

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

8
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
30.06.2011, 17:23 #2
как обычно, рекурсивно.
или что?
1
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
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
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.07.2011, 05:59 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
кто-то из нас чего-то недопонял...
я уже написал, что это решается банальной рекурсией.
уточню: именно шаблонной рекурсией.
1
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
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
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 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
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
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
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 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
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2011, 19:36
Привет! Вот еще темы с ответами:

Определить mpl последовательность - C++
здравствуйте, помогите допилить mpl-sequence до юзабельного состояния, за основу взято это: http://rsdn.ru/forum/cpp/4523366.all в...

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

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

Не идет проход по элементам списка - C (СИ)
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;string.h&gt; #define N 100; struct Node { ...


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

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

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