#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;
}
Возможно ли при передаче пака параметров принять его по ссылке и что-то изменить в одном из параметров?
Навскидку придумалось - сработать через указатели:
template<typename... Args>
void foo(Args&... args)
{
constexpr size_t param_count = sizeof...(args);
string* sarray[param_count] = { &args... }; // <= Copy-array
*(sarray[0]) = "Goodbye";
}
Альтернативный вариант: воспользоваться 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;
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости