Variadic templates передача и возврат по ссылке

124
09 июня 2019, 09:40
#include <iostream>
#include <string>
template<typename... Args>
void foo(Args&... args)
{
    size_t param_count = sizeof...(args);
    std::string sarray[] = { (args)... };  // <= Copy-array
    sarray[0] = "Goodbye";
}
int main()
{
    std::string str1 = "Hello";
    std::string str2 = "World";
    std::cout << str1 << std::endl;
    std::cout << str2 << std::endl;
    foo(str1, str2);
    std::cout << str1 << std::endl;
    std::cout << str2 << std::endl;
    system("pause");
    return 0;
}

Возможно ли при передаче пака параметров принять его по ссылке и что-то изменить в одном из параметров?

Answer 1

Навскидку придумалось - сработать через указатели:

template<typename... Args>
void foo(Args&... args)
{
    constexpr size_t param_count = sizeof...(args);
    string* sarray[param_count] = { &args... };  // <= Copy-array
    *(sarray[0]) = "Goodbye";
}
Answer 2

Альтернативный вариант: воспользоваться std::tie:

#include <tuple>
template<typename... Args>
void foo(Args & ... args)
{
    auto items{::std::tie(args...)}; // кортеж ссылок
    ::std::get<0>(items).assign("Goodbye"); // проверка индекса во время компиляции
}

Для простого случая, когда все аргументы имеют одинаковый тип, можно написать нешаблонную функцию воспользовавшись std::initializer_list:

#include <initializer_list>
#include <string>
#include <type_traits>
#include <iostream>
void foo(::std::initializer_list<::std::reference_wrapper<::std::string>> args)
{
    auto p_args{args.begin()};
    p_args[0].get() = "Goodbye";
}
int main()
{
    std::string str1 = "Hello";
    std::string str2 = "World";
    std::cout << str1 << std::endl;
    std::cout << str2 << std::endl;
    foo({str1, str2});
    std::cout << str1 << std::endl;
    std::cout << str2 << std::endl;
    return 0;
}
READ ALSO
Два MPI_Bcast путают сообщения друг друга

Два MPI_Bcast путают сообщения друг друга

Задали нам на дом найти факториал 16!, используя MPIВсё хорошо считается до тех пор, пока два MPI_Bcast не начинают отправлять сообщения всем потокам

139
промахи в кэш L2 и попадание в кэш L3

промахи в кэш L2 и попадание в кэш L3

подскажите пожалуйста, на каком примере можно рассмотреть промахи в кэш L2 и попадание в кэш L3? я не могу найти примеров на c++, где на конкретном...

125
Проблема с кодом в c++

Проблема с кодом в c++

Не могу понять почему слово симметрична выводится 16 раз, n и m равны 4, и такое ощущение что код как то эти значения умножаетВ чем ошибка ? вот...

139
Qt5, Code::Blocks, undefined reference

Qt5, Code::Blocks, undefined reference

Пытаюсь добавить Qt5 в готовый проектВозникли две ошибки: undefined reference to "_imp___ZN12QApplicationC1ERiPPci' и undefined reference to "_imp___ZN12QApplicationD1Ev'

130