如何检测类型是否是另一种类型的可见基础?

Fab*_*era 13 c++ inheritance templates

如果我做

struct A{};
struct C:private A{};

typedef char (&yes)[1];
typedef char (&no)[2];

template <typename B, typename D>
struct Host
{
 operator B*() const;
 operator D*();
};

template <typename B, typename D>
struct is_base_of
{
template <typename T> 
static yes check(D*, T);
static no check(B*, int);

static const bool value = sizeof(check(Host<B,D>(), int())) == sizeof(yes);
};

int main(){
 std::cout<<is_base_of<A,C>::value<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我得到一个1.我想C在私有时获得0,在公共A时获得1 .CA

[代码源自`is_base_of`如何工作的?]

Mic*_*rce 4

您可以使用支持 C++11 的编译器吗?

如果是这样,您可以结合 Chad 的使用static_castdecltype创建一个非常简单的类型特征实现(如本问题所示)。根据 Jonathan Wakely 的建议,引用已替换为指针,以避免在D定义operator B&().

template<typename> struct AnyReturn { typedef void type; };

template<typename B, typename D, typename Sfinae = void>
struct is_base_of: std::false_type {};

template<typename B, typename D>
struct is_base_of<B, D,
    typename AnyReturn< decltype( static_cast<B*>( std::declval<D*>() ) ) >::type
>: std::true_type {};
Run Code Online (Sandbox Code Playgroud)

使用 gcc 4.7 时:

struct Base {};
struct PublicDerived  : public  Base {};
struct PrivateDerived : private Base {};

int main()
{
    std::cout << is_base_of<Base, PublicDerived >::value << std::endl; // prints 1
    std::cout << is_base_of<Base, PrivateDerived>::value << std::endl; // prints 0
    return 0;
}
Run Code Online (Sandbox Code Playgroud)