Можно ли расширить невариантные аргументы в функции вариационного шаблона?

Вероятно, легче объяснить, что я имею в виду на примере. Представьте следующий шаблон:

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