The question is, why it doesn't work if tuple is not at the first position of its parent. Looks like it doesn't see overload for tuple from inside _after_print.
_print(make_tuple(), 0);
Evaluates to this:
a tuple
not a tuple
And
_print(0, make_tuple());
Gives this:
not a tuple
not a tuple
template <typename _First, typename ..._Vals>
void _print(_First&& first, _Vals... _vals)
{
cout << "not a tuple" << endl;
_after_print(_vals...);
}
template <typename ..._List, typename ..._Vals>
void _print(tuple<_List...>&& t, _Vals... _vals)
{
cout << "a tuple" << endl;
_after_print(_vals...);
}
void _print() {}
template <typename ..._Vals>
void _after_print(_Vals... _vals)
{
_print(_vals...);
}