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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
cyberguz
6 / 6 / 0
Регистрация: 01.12.2010
Сообщений: 105
#1

tuple foreach - C++

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

Взял за основу вот это
http://stackoverflow.com/questions/5...r-of-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 ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2012, 13:57     tuple foreach
Посмотрите здесь:

Аналог foreach Visual C++
Boost C++ boost foreach где ошибка?
boost::serialization как сериаизовать std::tuple? Boost C++
Доступ к элементам tuple в шаблонах C++
C++ Инициализация std::tuple переменным числом аргументов
C++ Foreach
C++ Как пройтись по всем типам std::tuple
Tuple, получение значения по индексу C++
Foreach цикл и потоки C++
C++ Создать tuple на этапе выполнения программы в C++ 11
C++ Отличие итератора от foreach
Как сделать один универсальный класс-контейнер а-ля std::tuple из двух различных классов? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
27.03.2012, 19:39     tuple foreach #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/bed68f...ee4e1fcc68fcee
Yandex
Объявления
27.03.2012, 19:39     tuple foreach
Ответ Создать тему
Опции темы

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