Я использую механизм SFINAE для определения типа. Resolve<T>::type
выводится в T
, если class T
не содержит yes
, и выводится в MyClass
, если оно содержит yes
.
class MyClass {};
template<typename>
struct void_ { typedef void check; };
template<typename T, typename = void>
struct Resolve { typedef T type; };
template<typename T>
struct Resolve <T, typename void_<typename T::yes>::check> {
typedef MyClass type;
};
Теперь у меня есть простые тестовые классы, как,
struct B1 { typedef int yes; }; // 1
struct B2 { typedef int yes; }; // 2
struct D1 {}; // 3
struct D2 : B1 {}; // 4
struct D3 : B1, B2 {}; // 5 <----
В соответствии с приведенной ниже логикой, результатом вышеприведенных испытаний должен быть:
Resove<B1>::type = MyClass
Resove<B2>::type = MyClass
Resove<D1>::type = D1
Resove<D2>::type = MyClass
Resove<D3>::type = MyClass
или ошибка компилятора (из-за неоднозначности между B1, B2)
Странно, но в тестовом примере (5) этого не произошло. Результат
Resolve<D3>::type = D3;
Может кто-нибудь объяснить, что магия происходит специально для множественного наследования? Не получается ошибка компилятора - это стандартное поведение? Вот демоверсия .