Здесь СФИНА не происходит.Все вызовы DoStuff
будут вызывать
template <typename T, typename...>
void DoStuff(T input) {
input.bar();
}
Причина этого в том, что
template <typename T, typename>
void DoStuff(T input) {
input.foo();
}
требует два параметра шаблона, в то время как
template <typename T, typename...>
void DoStuff(T input) {
input.bar();
}
работает для1 или более параметров шаблона (пустые пакеты могут быть пустыми).Поэтому, когда вы звоните
DoStuff(Foo());
// or
DoStuff(Bar());
//or
DoStuff(Both());
, вы можете вывести только один шаблонный параметр, и единственным приемлемым кандидатом является
template <typename T, typename...>
void DoStuff(T input) {
input.bar();
}
Если вы использовали
DoStuff<Foo, any_other_type>(Foo());
, товы получите ошибку неоднозначности, поскольку она соответствует обоим шаблонам.