А теперь ... для чего-то совершенно другого ...
Вы можете написать структуру типа оболочки следующим образом
template <typename, typename T>
struct wrp
{ using type = T; };
template <typename U, typename T>
using wrp_t = typename wrp<U, T>::type;
и функция foo()
, получающие список переменных char const *
, просто становятся
template <typename ... Args>
void foo (wrp_t<Args, char const *> ... args)
{
for ( char const * arg : {args...} )
std::cout << "- " << arg << std::endl;
}
Проблема в том, что вы не можете называть это так, как хотите
foo("hello", "world");
, поскольку компилятор не может определить типы Args...
.
Очевидно, что вы можете указать список фиктивных типов
foo<void, void>("hello", "world");
но я понимаю, что это ужасное решение.
В любом случае, если вы согласитесь пройти через тривиальную шаблонную функцию
template <typename ... Args>
void bar (Args ... args)
{ foo<Args...>(args...); }
Вы можете позвонить
bar("hello", "world");
Ниже приведен полный рабочий пример C ++ 11
#include <iostream>
template <typename, typename T>
struct wrp
{ using type = T; };
template <typename U, typename T>
using wrp_t = typename wrp<U, T>::type;
template <typename ... Args>
void foo (wrp_t<Args, char const *> ... args)
{
for ( char const * arg : {args...} )
std::cout << "- " << arg << std::endl;
}
template <typename ... Args>
void bar (Args ... args)
{ foo<Args...>(args...); }
int main ()
{
bar("hello", "world"); // compile
// bar("hello", "world", 0); // compilation error
}