C++ 用于检测非继承typedef的Trait

C++ 用于检测非继承typedef的Trait,c++,typedef,typetraits,C++,Typedef,Typetraits,如果struct具有未继承的typedef,是否有方法检测 以下代码在C #include <iostream> struct A { }; struct B : public A { typedef A Base; }; struct C : public B {}; template<typename T> struct to_void { typedef void type; }; template <typename T, typename d

如果
struct
具有未继承的
typedef
,是否有方法检测

以下代码在
C

#include <iostream>

struct A { };
struct B : public A { typedef A Base; };
struct C : public B {};

template<typename T>
struct to_void
{
    typedef void type;
};

template <typename T, typename dummy = void>
struct has_base_typedef : std::false_type {};

template <typename T>
struct has_base_typedef<T, typename to_void<typename T::Base>::type> : std::true_type {};

int main()
{
    std::cout << has_base_typedef<A>::value;
    std::cout << has_base_typedef<B>::value;
    std::cout << has_base_typedef<C>::value;
}
#包括
结构A{};
结构B:公共A{typedef A Base;};
结构C:公共B{};
模板
结构到_void
{
typedef-void型;
};
模板
结构具有_base_typedef:std::false_type{};
模板
结构具有_base_typedef:std::true_type{};
int main()
{

std::cout基本上,您想要阻止
别名隐式传播到派生类,我认为这是不可能的。我能想到的实现接近您想要的东西的唯一方法是:

struct C;

struct A {};
struct B : public A {
  using Base = A; 
  using Derived = C;
};
struct C : public B { };

template<typename T>
struct to_void {
    typedef void type;
};

template <typename T, typename dummy = void>
struct has_base_typedef : std::false_type {};

template <typename T>
struct has_base_typedef<T, std::enable_if_t<!std::is_same<typename T::Derived, T>::value, 
                            typename to_void<typename T::Base>::type>> : std::true_type {};
structc;
结构A{};
结构B:公共A{
使用Base=A;
使用派生=C;
};
结构C:公共B{};
模板
结构到_void{
typedef-void型;
};
模板
结构具有_base_typedef:std::false_type{};
模板
结构具有_base_typedef::type>>:std::true_type{};

OP expected
010
它得到了:-)谢谢你的回答,不幸的是,这不是我要寻找的一般方法。派生类可以不止一个(必须使用类型列表),并且struct可以在库中,并且在创建新的派生类时不应该(不能)修改。。。