Search code examples
c++parameter-passingvariadic-templates

Pass explict empty arguments pack


I'm trying to overload constructors as follows

struct foo
{
    foo(int, int);

    template<typename... Args>
    foo(int, int, Args... args);
}

foo(int, int) behaves differently from foo(int, int, empty_arguments_pack). I want foo(1, 2) to call foo(int, int) and something like foo(1, 2, ) to call foo(int, int, Args...). How can i do that?


Solution

  • You cannot call explicitly template constructor as foo<>(1, 2) /*Illegal*/

    You might create other tagged overloads foo(special_tag, int, int/*, Args...*/) to solve your issue

    struct special_tag{};
    
    class foo
    {
    public:
        template<typename... Args>
        foo(special_tag, int i1, int i2, Args... args) { /**/}
    
        foo(int, int) { /*...*/}
    
        // And possibly
        template<typename... Args>
        foo(int i1, int i2, Args... args) : foo(special_tag{}, i1, i2, args...) { /*...*/}
    };
    

    Now, you can use:

    foo(1, 2); // foo(int, int)
    foo(special_tag{}, 1, 2); // foo(special_tag, int, int, Args...)
    foo(special_tag{}, 1, 2, 3); // foo(special_tag, int, int, Args...)
    // And possibly:
    foo(1, 2, 3); // foo(int, int, Args...) so foo(special_tag, int, int, Args...)