Можно ли расширить невариантные аргументы в функции вариационного шаблона?
Вероятно, легче объяснить, что я имею в виду на примере. Представьте следующий шаблон:
template <class... Args>
std::tuple<Args...> foo();
Его можно вызвать, например, следующим образом:
auto ret = foo<int, bool>();
Но что, если я хочу передать дополнительные аргументы функции, исходя из числа аргументов вариационного шаблона? Например, допустим, что я хочу передать литерал строки символов для каждого Args:
auto ret = foo<int, bool>("a", "b");
Проблема с этим заключается в том, что не представляется возможным расширять невариантные аргументы, поэтому следующее, очевидно, не компилируется:
template <class... Args>
std::tuple<Args...> foo(const char*... names);
Есть ли разумный способ реализовать это?
Ответы
Ответ 1
Вы можете сделать это с чем-то вроде
template <class... Args>
std::tuple<Args...> foo(proxy<Args, const char*>... names);
где proxy
template<class T, class E>
using proxy = E;
Вы можете увидеть это в действии здесь: https://godbolt.org/g/SHBYzy