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?
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...)