Самый простой ответ будет иметь только один шаблон с максимальным числом, которое вы хотите поддерживать, и использовать void для типа по умолчанию для всех типов, кроме первого.Тогда вы можете использовать частичную специализацию по мере необходимости:
template<typename T1, typename T2=void>
struct foo {
void operator()(T1, T2);
};
template <typename T1>
struct foo<T1, void> {
void operator()(T1);
};
int main() {
foo<int> test1;
foo<int,int> test2;
test1(0);
test2(1,1);
}