powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Распаковка std::tuple
11 сообщений из 11, страница 1 из 1
Распаковка std::tuple
    #39985579
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача: упаковать вариативные параметры в 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
Распаковка std::tuple
    #39985583
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Распаковка std::tuple
    #39985588
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

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


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

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


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

Код: 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
Распаковка std::tuple
    #39985690
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Распаковка std::tuple
    #39985691
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
std::apply(tupleUnpack<Parameters...>, tuple);
...
Рейтинг: 0 / 0
Распаковка std::tuple
    #39985694
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Код: plaintext
1.
std::apply(tupleUnpack<Parameters...>, tuple);


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


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