Yes, make separate overloads:
template <typename A1>
func(A1 arg1)
{
x(arg1);
}
template <typename A1, typename A2>
func(A1 arg1, A2 arg2)
{
y(arg1, arg2);
}
template <typename A1, typename A2, typename A3>
func(A1 arg1, A2 arg2, A3 arg3)
{
z(arg1, arg2, arg3);
}
(Any additional, common code can of course be factored into a separate, common function, possibly a variadic function template.)