Можно ли использовать пакеты параметров c ++ 11 вне шаблонов?

Мне было интересно, могу ли я иметь пакеты параметров, состоящие из одного, явно определенного типа. Например, что-то вроде этого:

#include <iostream>

using namespace std;

void show() { }

template<typename First, typename... Rest>
void show(First f, Rest... rest)
{
    cout << f << endl;
    show(rest...);
}

void foo(int f, int... args) // error
{
    show(f, args...);
}

int main()
{
    foo(1, 2, 3);
}

У меня проблема с определениемfoo(), С OS X clang ++ версии 5 (llvm 3.3svn) я получаю ошибкуerror: type 'int' of function parameter pack does not contain any unexpanded parameter packs.

Конечно, я могу получить его для компиляции, изменивfoo() в шаблон функции:

template<typename... Args>
void foo(int f, Args... args)
{
    show(f, args...);
}

Однако сейчасfoo() примуint по первому параметру, и все, что выводится, для остальных. Например:

struct x { };
ostream& operator<<(ostream& o, x)
{
    o << "x";
    return o;
}

int main()
{
    foo(1, 2, x(), 3); // compiles :(
}

Теперь я виделпринятое решение здесь который предлагает использовать черты типа иstd::enable_if, но это громоздко. Они также предложили использоватьstd::array но я думаю простойstd::initializer_list работает просто отлично и выглядит чище, вот так:

void foo_impl(initializer_list<int> ints)
{
    for(int i: ints)
        cout << i << endl;
}

template<typename... Args>
void foo(int f, Args... args)
{
    foo_impl({f, args...});
}

struct x { };
ostream& operator<<(ostream& o, x)
{
    o << "x";
    return o;
}

int main()
{
    foo(1, 2, 3);
    foo(1, 2, x(), 3); // no longer compiles
                       // we also get an error saying no known conversion from 'x' to 'int' :)
}

Так что это аккуратно. Но остается вопрос, нужно ли это? Неужели нет способа определить не шаблонную функцию, которая принимает пакет параметров определенного типа? Нравится:

void foo(int... args) { }

Ответы на вопрос(4)

Ваш ответ на вопрос