Вы можете использовать параметры по умолчанию, если вы можете определить по умолчанию:
template<typename T, typename U = /* default */>
struct A {
};
Если вы хотите обработать различное количество параметров шаблона с другим поведением, вы также можете использовать вариационные шаблоны и специализацию для этого:
template<typename...>
struct A;
template<typename T>
struct A<T> { // specialization for one parameter
};
template<typename T, typename U>
struct A<T, U> { // specialization for two parameter
};
int main() {
A<double> ad;
A<int, int> a;
// A<int, int, int> a; // error, undefined
}