Czy można używać pakietów parametrów c ++ 11 poza szablonami?

Zastanawiałem się, czy mogę mieć pakiety parametrów składające się z pojedynczego, jawnie określonego typu. Na przykład coś takiego:

#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);
}

Mam problem z definicjąfoo(). Z OS X clang ++ wersja 5 (llvm 3.3svn) Dostaję błąderror: type 'int' of function parameter pack does not contain any unexpanded parameter packs.

Oczywiście mogę go skompilować, zmieniając nafoo() w szablon funkcji:

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

Jednak terazfoo() zaakceptujeint dla pierwszego parametru, a wszystko wyjście strumieniowe dla reszty. Na przykład:

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

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

Teraz widziałemprzyjęte rozwiązanie tutaj co sugeruje użycie cech typu istd::enable_if, ale to nieporęczne. Zasugerowali także użyciestd::array ale myślę, że to prostestd::initializer_list działa dobrze i wygląda czysto, tak:

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' :)
}

Więc to jest miłe. Ale pozostaje pytanie, czy to konieczne? Czy naprawdę nie istnieje sposób na zdefiniowanie funkcji innej niż szablon, która akceptuje pakiet parametrów określonego typu? Lubię to:

void foo(int... args) { }

questionAnswers(4)

yourAnswerToTheQuestion