Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
6 / 6 / 1
Регистрация: 01.12.2010
Сообщений: 105
1

tuple foreach

27.03.2012, 13:57. Просмотров 1798. Ответов 1
Метки нет (Все метки)

Взял за основу вот это
http://stackoverflow.com/quest... -arguments

способ заработал после небольших изменений:
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
template <size_t i, template <class Arg> class UnaryFunction, class... Tp>
struct UnaryFunctionTupleElement;
 
template <size_t i, template <class Arg> class UnaryFunction, class Head, class... Tail>
struct UnaryFunctionTupleElement <i, UnaryFunction, std::tuple<Head, Tail...> > :
    UnaryFunctionTupleElement <i - 1, UnaryFunction, std::tuple<Tail...> > {};
 
template <template <class Arg> class UnaryFunction, class Head, class... Tail>
struct UnaryFunctionTupleElement <0, UnaryFunction, std::tuple<Head, Tail...> >
{
    static void call (Head& arg)
    {
        UnaryFunction<Head>uf;
        uf(arg);
    }
};
 
template <size_t I, size_t N, template <class Arg> class UnaryFunction, class... Tp>
struct for_;
 
template <size_t N, template <class Arg> class UnaryFunction, class... Tp>
struct for_<N, N, UnaryFunction, std::tuple<Tp...> >
{
    static void call (std::tuple<Tp...>&) {}
};
 
template <size_t I, size_t N, template <class Arg> class UnaryFunction, class... Tp>
struct for_ <I, N, UnaryFunction, std::tuple<Tp...> >
{
    static void call (std::tuple<Tp...>& t)
    {
        UnaryFunctionTupleElement<I, UnaryFunction, std::tuple<Tp...> >::call(std::get<I>(t));
        for_<I + 1, N, UnaryFunction, std::tuple<Tp...> >::call(t);
    }
};
 
template <template <class Arg> class UnaryFunction, class Tuple>
inline void for_each (Tuple& t)
{
    for_<0, std::tuple_size<Tuple>::value, UnaryFunction, Tuple>::call(t);
}
 
// использование
 
template <class Arg>
struct print_arg
{
    void operator() (Arg& a) {std::cout << a << std::endl;}
};
 
int main ()
{
     auto tup = std::make_tuple(10, 'a', "string");
     sss::for_each<print_arg>(tup);
}

а такой вариант (который первоначально получился) не заработал:
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 <size_t I, size_t N, template <class Arg> class UnaryFunction, class Tuple>
struct for_;
 
template <size_t N, template <class Arg> class UnaryFunction, class Tuple>
struct for_<N, N, UnaryFunction, Tuple>
{
    static void call (Tuple&) {}
};
 
template <size_t I, size_t N, template <class Arg> class UnaryFunction, class Tuple>
struct for_
{
    static void call (Tuple& t)
    {
/*
В следующей строке выдаёт ошибку:
error: type/value mismatch at argument 1 in template parameter list for 'template<class Arg> class  UnaryFunction'
error:   expected a type, got 'std::tuple_element<I, Tuple>::type'
*/
        UnaryFunction<std::tuple_element<I, Tuple>::type> uf; 
        uf(std::get<I>(t));                                                  
        for_<I + 1, N, UnaryFunction, Tuple>::call(t);
    }
};
 
template <template <class Arg> class UnaryFunction, class Tuple>
inline void for_each (Tuple& t)
{
    for_<0, std::tuple_size<Tuple>::value, UnaryFunction, Tuple>::call(t);
}
Почему компилятор не вычисляет std::tuple_element<I, Tuple>::type ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.03.2012, 13:57
Ответы с готовыми решениями:

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

Ошибка в файле tuple
Заранее извиняюсь, что кидаю программу целиком. Я вынужден это сделать, так ошибка (о которой речь...

Печать элементов tuple
Добрый день! Подскажите, пожалуйста,хочу распечатать элементы кортежа: template&lt;unsigned N,...

Кортеж (Tuple), чем заменить?
Fixer_84, Как можно заменить Tuple ? using namespace std; tuple&lt;int, int, double&gt; F(int N)...

1
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
27.03.2012, 19:39 2
cyberguz, Потому что нужно typename. Зависимые имена. Читайте стандарт.

Добавлено через 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
26
27
28
29
30
template <size_t I,     size_t N, template <class Arg> class UnaryFunction, class Tuple>
struct for_;
 
template <size_t N, template <class Arg> class UnaryFunction, class Tuple>
struct for_<N, N, UnaryFunction, Tuple>
{
        static void call (Tuple&) {}
};
 
template <size_t I, size_t N, template <class Arg> class UnaryFunction, class Tuple>
struct for_
{
        static void call (Tuple& t)
        {
/*
В следующей строке выдаёт ошибку:
error: type/value mismatch at argument 1 in template parameter list for 'template<class Arg> class  UnaryFunction'
error:   expected a type, got 'std::tuple_element<I, Tuple>::type'
*/
                UnaryFunction<typename std::tuple_element<I, Tuple>::type> uf; 
                uf(std::get<I>(t));                                                  
                for_<I + 1, N, UnaryFunction, Tuple>::call(t);
        }
};
 
template <template <class Arg> class UnaryFunction, class Tuple>
inline void for_each (Tuple& t)
{
        for_<0, std::tuple_size<Tuple>::value, UnaryFunction, Tuple>::call(t);
}
Без проблем отработает.
http://liveworkspace.org/code/... 1fcc68fcee
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2012, 19:39

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

Доступ к элементам tuple в шаблонах
Собственно, не могу понять как работать с элементами кортежа в цикле, не получается получить к ним...

Tuple, получение значения по индексу
Есть вот такая реализация Tuple: template &lt;class...Args&gt; class typle; template&lt;class Head,...

Создать tuple на этапе выполнения программы в C++ 11
Предположим в целочисленных переменных типа int есть некоторые значения. Нужно во время выполнения...

Ошибка при компиляции. Ругается на tuple
Добрый день! Недавно программирую на плюсах, поэтому большинство ошибок очень сильно пугают,...


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

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

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