С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 28.01.2012
Сообщений: 46
1

tuple and pack parameters

22.05.2020, 09:21. Показов 388. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, подскажите, пожалуйста, как реализовать примерный код:


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
template <typename... Args>
class A
{
public:
    A(Args... args) {ind = std::make_tuple(args...);}
    std::tuple<Args...> ind;
};
 
void foo()
{
    std::cout << std::endl;
}
 
template <typename First, typename... Rest>
void foo(First _first, Rest... _rest)
{
    std::cout << _first;
    foo(_rest...);
}
 
 
int main()
{
    A a1(1, 2);
    A a2(1, 2, 3);
    A a3(1, 2, 3, 4);
 
    foo(a1.ind);
    foo(a2.ind);
    foo(a3.ind);
}
Добавлено через 41 минуту
класс А, не обязательно должен хранить индекс в tuple, главное передать этот индекс в функцию.
Экземпляров класса А может быть много
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2020, 09:21
Ответы с готовыми решениями:

Использование #pragma pack(push,1)... pack(pop)
Добрый день, товарищи. Задался вопросом о записи в файл структур данных, читал читал в интернете...

SFML - ошибка "std::tuple<sf::RenderWindow>::tuple: ни одна из 2 перегрузок не может преобразовать все типы аргументов"
Хотел создать поток, передаю в функцию переменную window, где хранится игровое окно. При...

Русские символы NT 4.0+Service pack 6 + Option pack + MS SQL7.0 с СР1251
Помогите пожалуйста!!!!!! имею NT 4.0+Service pack 6 + Option pack + MS SQL7.0 с СР1251 Выполняю...

Pack() [function.pack]: Type H: illegal hex digit m in
Возникла довольно странная проблема, при загрузке страницы вылезает Warning: pack() : Type H:...

5
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
22.05.2020, 09:28 2
sema_90,

С++17
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
#include <tuple>
#include <iostream>
 
template <typename... Args>
class A
{
public:
    A(Args... args) {ind = std::make_tuple(args...);}
    std::tuple<Args...> ind;
};
 
void foo()
{
    std::cout << std::endl;
}
 
template <typename First, typename... Rest>
void foo(First _first, Rest... _rest)
{
    std::cout << _first;
    foo(_rest...);
}
 
 
int main()
{
    A a1(1, 2);
    A a2(1, 2, 3);
    A a3(1, 2, 3, 4);
 
    std::apply([](auto ...x){ foo(x...); }, a1.ind);
    std::apply([](auto ...x){ foo(x...); }, a2.ind);
    std::apply([](auto ...x){ foo(x...); }, a3.ind);
}
0
0 / 0 / 0
Регистрация: 28.01.2012
Сообщений: 46
22.05.2020, 09:50  [ТС] 3
а если я ограничен С++11?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
22.05.2020, 09:53 4
Цитата Сообщение от sema_90 Посмотреть сообщение
а если я ограничен С++11?
Ну тогда вам нужно повторить реализацию std::apply вручную.
0
0 / 0 / 0
Регистрация: 28.01.2012
Сообщений: 46
22.05.2020, 13:04  [ТС] 5
Ну тогда вам нужно повторить реализацию std::apply вручную.
А если использоваться не tuple? нет способа попроще?

Добавлено через 21 минуту
Ну тогда вам нужно повторить реализацию std::apply вручную.
Попробовал понять как это сделать, не получилось(

Добавлено через 2 часа 6 минут

на другом форуме помогли:

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
template <typename... Args>
class A
{
public:
    A(Args... args) {ind = std::make_tuple(args...);}
    std::tuple<Args...> ind;
};
 
void foo()
{
    std::cout << std::endl;
}
 
template <typename First, typename... Rest>
void foo(First _first, Rest... _rest)
{
    std::cout << _first;
    foo(_rest...);
}
 
template< size_t ... Ints >
class integer_sequence{};
 
 
template < typename T, size_t N >
struct add_sequence;
 
template < size_t N, size_t ... IDX >
struct add_sequence< integer_sequence<IDX...>, N>
{
    using type = integer_sequence< IDX..., N>;
};
 
template < size_t N >
struct sequence_helper
{
    using type = typename add_sequence< typename sequence_helper<N-1>::type, N-1>::type;
};
 
template<>
struct sequence_helper<0>
{
    using type = integer_sequence<>;
};
 
template<size_t N>
using make_integer_sequence = typename sequence_helper<N>::type;
 
template < typename IS, typename TUPPLE >
struct call;
 
template < size_t ... IDX, typename ... PARMS >
struct call< integer_sequence< IDX...>, std::tuple< PARMS...>>
{
    static void go( std::tuple< PARMS...> parms )
    {
        foo( std::get< IDX >( parms ) ... );
    }
};
 
template < typename ... PARMS >
void foo2( std::tuple< PARMS...>& tup )
{
    call<make_integer_sequence< sizeof...(PARMS)>, std::tuple< PARMS...>>::go( tup );
}
 
 
int main()
{
    A<int, int> a1(1, 2);
    A<int, int, int> a2(1, 2, 3);
    A<int, int, int, int> a3(1, 2, 3, 4);
 
    foo2(a1.ind);
    foo2(a2.ind);
    foo2(a3.ind);
}
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
22.05.2020, 13:08 6
Как-то так можно:
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
56
57
58
#include <tuple>
#include <iostream>
 
template <typename... Args>
class A
{
public:
    A(Args... args) {ind = std::make_tuple(args...);}
    std::tuple<Args...> ind;
};
 
 
template<typename T>
void output(T const & v)
{
    std::cout << v;
}
 
template<typename ... Args, size_t ... Indexes>
void output_tuple(std::tuple<Args...> const & t, std::index_sequence<Indexes...>)
{
    int fake[] = 
    {
        (output(std::get<Indexes>(t)), 0)...
    };
    (void)fake;//make happy
}
 
template<typename ... Args>
void output(std::tuple<Args...> const & v)
{
    output_tuple(v, std::make_index_sequence<sizeof...(Args)>());
}
 
void foo()
{
    std::cout << '\n';
}
 
template <typename First, typename... Rest>
void foo(First _first, Rest... _rest)
{
    output(_first);
    foo(_rest...);
}
 
 
 
int main()
{
    A a1(1, 2);
    A a2(1, 2, 3);
    A a3(1, 2, 3, 4);
 
    foo(a1.ind);
    foo(a2.ind);
    foo(a3.ind);
}
Но apply - это более общее решение.
1
22.05.2020, 13:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2020, 13:08
Помогаю со студенческими работами здесь

tuple foreach
Взял за основу вот это ...

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

Перевернуть tuple
На одной строке вам даны числа. Сохраните данные числа в tuple. Затем, разделив tuple на два,...

Немного о tuple
Короче мозг не варит, играюсь с функциями, суть: Есть функция sum, принимающая аргумент *numbers,...

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

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


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

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