struct A { void a() { puts("a"); } };
struct B { void b() { puts("b"); } };
struct C : A, B {};
template <typename T> decltype(&T::a, (void)0) SFINAE(T t) { t.a(); }
template <typename T> decltype(&T::b, (void)0) SFINAE(T t) { t.b(); }
int foo()
{
SFINAE(A{}); // works fine, calls a
SFINAE(B{}); // works fine, calls b
SFINAE(C{}); // compile error
}
Приведенный выше код завершается ошибкой при вызове SFINAE с типом, имеющим a
и b
, что делает оба шаблона действительными, что приводит к неоднозначному вызову. Как я могу исправить приведенный выше код, чтобы предпочесть первую перегрузку в неоднозначной ситуации? Так что SFINAE(C{})
должен позвонить a
.