Search code examples
c++templatesc++11variadic-templatesinitializer-list

Having trouble passing multiple initializer lists to variadic function template


I don't understand the error message when trying to pass a variable number of initializer lists:

template<typename... Values>
void foo(Values...)
{
}

int main()
{
    foo(1, 2, 3, "hello", 'a');   // OK

    foo({1}, {2, 3});             // ERROR
}

The error message complains about too many arguments:

prog.cpp: In function ‘int main()’:
prog.cpp:9:20: error: too many arguments to function
                      ‘void foo(Values ...) [with Values = {}]’
     foo({1}, {2, 3});
                    ^
prog.cpp:2:6: note: declared here
 void foo(Values...)
      ^

However, should I not be able to pass as many arguments as I want? [ideone link]


Solution

  • The problem is likely deducibility. {} could be uniform initializers to any of the arguments.

    This works:

    #include <initializer_list>
    
    template<typename... Values>
    void foo(std::initializer_list<Values>... args)
    {
    }
    
    template<typename... Values>
    void foo(Values&&... args)
    {
    }
    
    int main()
    {    
        foo(1, 2, 3, "hello", 'a');
        foo({1}, {2, 3});
    }
    

    See it Live on Coliru