Search code examples
c++templatesc++11variadic-templatesfunction-parameter

Variadic templates without function parameters


Can I use variadic templates without using the template parameters as function parameters?

When I use them, it compiles:

#include <iostream>
using namespace std;

template<class First>
void print(First first)
{
    cout << 1 << endl;
}

template<class First, class ... Rest>
void print(First first, Rest ...rest)
{
    cout << 1 << endl;
    print<Rest...>(rest...);
}

int main()
{
    print<int,int,int>(1,2,3);
}

But when I don't use them, it doesn't compile and complains about an ambiguity:

#include <iostream>
using namespace std;

template<class First>
void print()
{
    cout << 1 << endl;
}

template<class First, class ... Rest>
void print()
{
    cout << 1 << endl;
    print<Rest...>();
}

int main()
{
    print<int,int,int>();
}

Unfortunately the classes I want to give as template parameters are not instantiable (they have static functions that are called inside of the template function). Is there a way to do this?


Solution

  • template<class First> // 1 template parameter
    void print()
    {
        cout << 1 << endl;
    }
    
    #if 0
    template<class First, class ... Rest> // >=1 template parameters -- ambiguity!
    void print()
    {
        cout << 1 << endl;
        print<Rest...>();
    }
    #endif
    
    template<class First, class Second, class ... Rest> // >=2 template parameters
    void print()
    {
        cout << 1 << endl;
        print<Second, Rest...>();
    }