用于检测非继承typedef的特征

时间:2015-11-24 16:32:12

标签: c++ typedef typetraits

如果structtypedef没有继承,是否有办法检测?

以下代码在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;
}

C的特性给true Base,因为private是继承的(010修饰符无法帮助AFAIK)

我的目标是让代码段打印{{1}}

Small example与ideone一起玩。

1 个答案:

答案 0 :(得分:0)

基本上,您希望阻止Base别名隐式传播到派生类,我认为这是不可能的。我能想到的唯一方法是达到你想要的东西:

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 {};

Live Demo