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

C++

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

tuple foreach - C++

27.03.2012, 13:57. Просмотров 1279. Ответов 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 ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2012, 13:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос tuple foreach (C++):

реализация foreach в C++, другой синтсксис - C++
нашел тут некоторое собрание библиотек на буст орг, там есть такая что содержет реализацию функции... или чего то подобного... foreach,...

О "нестабильности" или "переполнении" цикла foreach - C++
Здравствуйте, коллеги. Недавно коллега-программист сообщил мне страшную вещь: оказывается, что цикл foreach может переполниться при...

Foreach: Как же это осуществить в C++ Builder 6. Какую замену использовать этому оператору? - C++ Builder
Как мне быть если в C++ Builder 6 нету оператора foreach. Покрайней мере я его не смог использовать. Мне нужно что-то типа этого for...

Аналог foreach - Visual C++
У меня есть обьект, поддерживающий интерфейс IEnumerable&lt;T&gt;. Как пройтись по всем елементам? В C# это просто foreach(var item in items)...

Обработка XML. Цикл foreach (XmlNode.) вложенный во внешний foreach - C#
Здравствуйте. Возникла проблема при обработке XML-файла (с помощью XMLDocument). В теме я новичок. Имеется XML файл такого типа: ...

Ошибка в foreach: foreach statement cannot operate on variables of type 'System.Collections.IEnumerator' - C#
using System; using System.Collections; namespace P { class Program { public static IEnumerator...

1
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
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/bed68f...ee4e1fcc68fcee
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2012, 19:39
Привет! Вот еще темы с ответами:

Нужен простой пример из Foreach в Parallel.Foreach - C#
Покажите любой простой пример из Foreach в Parallel.Foreach. Не могу до конца понять.

.NET 4.x Out/tuple vs Result - C#
Вопрос такой: иногда требуется методу вернуть несколько значений, когда следует возвращать значения с помощь out/tuple а когда использовать...

.NET 4.x Tuple (кортежи) - C#
Подскажите пожалуйста реальный пример применения кортежей? Я что-то не могу понять для чего может понадобиться....

Изменить значение Tuple - C#
Здравствуйте. Вот у меня такая проблема. У меня есть код Tuple&lt;string, string, int, double, string&gt; Demands = { ...


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

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

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