Раньше я полагал, что "typedef" не наследуется автоматически. Но привязка кода ниже предлагает что-то другое.
#include <iostream>
#include <type_traits>
struct A
{
typedef int X;
};
struct A_
{
typedef char X;
};
struct B : A {};
struct B_ : A, A_ {};
template< typename ... Ts >
using void_t = void;
template< typename T, typename = void >
struct has_typedef_X : std::false_type {};
template< typename T >
struct has_typedef_X< T, void_t<typename T::X> > : std::true_type {};
int main()
{
std::cout << std::boolalpha;
std::cout << has_typedef_X<A>::value << std::endl;
std::cout << has_typedef_X<A_>::value << std::endl;
std::cout << has_typedef_X<B>::value << std::endl;
std::cout << has_typedef_X<B_>::value << std::endl;
return 0;
}
Результат: true true true false.
Но, с моей точки зрения, "has_typedef_X<B>::value
", дающее "истина", подразумевает, что в структуре B X "typedef'ed".
Итак, если кто-нибудь может объяснить эту проблему или исправить меня?
Онлайн-версия доступна на http://melpon.org/wandbox/permlink/iwZ6eZ3PoBPgyFBj [исправлено URL]