Я думаю, что нет способа сделать это. Ну, есть, но не в общем. Вы всегда можете явно записать перегрузки для каждого A
:
template<int B>
int bar(Foo<0> a, Foo<B> b) {
return 0 + B;
}
По сути, причина в том, что для каждого экземпляра Foo
определяется разная перегрузка bar
. Например, для Foo<0>
вы получите
template<int B>
int bar(Foo<0>, Foo<B>);
Для каждого экземпляра Foo
вы получите новый шаблон bar
. Все эти bar
независимы, потому что они используют параметр шаблона, который существует вне самого bar
(из внешнего шаблона).
Вы не можете использовать двойной синтаксис template<>
, потому что это будет означать, что у вас есть две вещи (класс, функция, ...), которые являются шаблоном. Это не тот случай, поскольку в качестве шаблона у вас есть только bar
. Для первого / второго ничего нет template<>
.
Вы не можете объединить их, потому что, как вы видели, вы получите другую функцию. Если вы посмотрите на экземпляр bar
выше для Foo<0>
, вы увидите, что это отличается от:
template<int A, int B>
int bar(Foo<A>, Foo<B>);
Созданная версия всегда будет лучше соответствовать, поскольку для первого параметра не нужно ничего выводить.