Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Распаковка std::tuple / 11 сообщений из 11, страница 1 из 1
31.07.2020, 14:40
    #39985579
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple
Задача: упаковать вариативные параметры в std::tuple (по значанию), а потом std::tuple распаковать в вариативные параметры. Вроде бы я решил задачу, но код странно работает: std::tuple не хочет принимать параметры одинаковых типов, типы должны быть уникальны. Что же делать?

Код: plaintext
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.
template <typename T>
T const &saveParam(T const &param)
{
    return param;
}

std::string saveParam(char const *const str)
{
    return str;
}

std::wstring saveParam(wchar_t const *const str)
{
    return str;
}

template <typename... Parameters>
void tupleUnpack(Parameters const &...params)
{
}

template <typename... Parameters>
void tupleSend(std::tuple<Parameters...> const &tuple)
{
    tupleUnpack(std::get<Parameters>(tuple)...);
}

template <typename... Parameters>
void tupleMake(Parameters const &...params)
{
    auto tuple = std::make_tuple(saveParam(params)...);
    tupleSend(tuple);
}

void tupleTest()
{
    tupleMake(12.8, '6', 7, "abc");
    tupleMake(12.8, '6', 7, "abc", "def"); // Не компилируется. Говорит дубликт
                                           // типов. ***?
}
...
Рейтинг: 0 / 0
31.07.2020, 14:44
    #39985583
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple
...
Рейтинг: 0 / 0
31.07.2020, 14:55
    #39985588
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple

Я что-то такое находил. Неужели не существует чего-то уже готового-стандартного и простого? Ведь мой код работает. Только с уникальными типами почему-то...
...
Рейтинг: 0 / 0
31.07.2020, 15:06
    #39985593
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple
petrav
Неужели не существует чего-то уже готового-стандартного и простого?


Существует, с С++17
https://en.cppreference.com/w/cpp/utility/apply

А пример выше для С++11.
...
Рейтинг: 0 / 0
31.07.2020, 15:10
    #39985601
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple
petrav
Ведь мой код работает. Только с уникальными типами почему-то...


Все правильно. std::get<Parameters> работает только для уникальых типов.
То, что я привел работает с числовыми индексами std::get<0>, 1, 2 и т.д. предварительно сформировав пакет из этих индексов.
...
Рейтинг: 0 / 0
31.07.2020, 15:32
    #39985613
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple
Anatoly Moskovsky
petrav
Ведь мой код работает. Только с уникальными типами почему-то...


Все правильно. std::get<Parameters> работает только для уникальых типов.
То, что я привел работает с числовыми индексами std::get<0>, 1, 2 и т.д. предварительно сформировав пакет из этих индексов.

Что-то не получается разобраться, помогите плиз. Вот как написать-то?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
template <typename... Parameters>
void tupleUnpack(Parameters const &...params)
{
}

template <typename... Parameters>
void tupleSend(std::tuple<Parameters...> const &tuple)
{
    std::apply(tupleUnpack, tuple);
}


Не работает.
...
Рейтинг: 0 / 0
31.07.2020, 15:48
    #39985618
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple
Кстати, вот так получилось:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct TupleUnpack
{
    template <typename... Parameters>
    TupleUnpack(Parameters const &...params)
    {
    }
};

template <typename... Parameters>
void tupleSend(std::tuple<Parameters...> const &tuple)
{
    auto aaa = std::make_from_tuple<TupleUnpack>(tuple);
}


Простейшая же задача, но TupleUnpack функцией сделать не получается.
...
Рейтинг: 0 / 0
31.07.2020, 20:19
    #39985690
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple
petrav
Что-то не получается разобраться, помогите плиз. Вот как написать-то?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
template <typename... Parameters>
void tupleUnpack(Parameters const &...params)
{
}

template <typename... Parameters>
void tupleSend(std::tuple<Parameters...> const &tuple)
{
    std::apply(tupleUnpack, tuple);
}



Не работает.


В std::apply надо передавать уже инстанцированную функцию или экземпляр класса . Потому что нельзя получить адрес шаблона.
...
Рейтинг: 0 / 0
31.07.2020, 20:21
    #39985691
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple
Код: plaintext
1.
std::apply(tupleUnpack<Parameters...>, tuple);
...
Рейтинг: 0 / 0
31.07.2020, 20:54
    #39985694
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple
Anatoly Moskovsky
Код: plaintext
1.
std::apply(tupleUnpack<Parameters...>, tuple);


Бинго! Спасибо. :)
...
Рейтинг: 0 / 0
01.08.2020, 20:53
    #39985834
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распаковка std::tuple
Кстати, надеюсь эти "std::make_tuple" и "std::apply" не меняют последовательностью аргументов? Я, конечно, протестировал, но мало ли. В C++ можно что угодно ожидать.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Распаковка std::tuple / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]