在编译期间检测继承

Jag*_*ath 8 c++

我无法弄清楚为什么这段代码返回false.我有部分专业化的第一个版本.它没用,我尝试了第二个版本.它也没用.

更新:我想检查"Derived"是否公开来自"Base".

更新:

    template<typename TDerived, typename TBase>
    struct Derived_From
    {

    public:
        static void constraints(TBase*, TDerived* ptr) { TBase* b = ptr; ignore(b); }
        Derived_From() { void (*p)(TBase*, TDerived*) = constraints; ignore(p);}
    };
Run Code Online (Sandbox Code Playgroud)

我在Strostrup的主页上找到了上面的代码片段.但是,如果派生类不是从Base公开派生的,它不会让代码编译.

template<class TBase, class TDerived>
struct IsDerived
{
    public:
    enum { isDerived = false };
};


template<class TBase>
struct IsDerived<TBase, TBase>
{
    public:
    enum {  isDerived = true };
};


template<class TBase>
struct IsDerived<TBase&, TBase&>
{
    public:
    enum {  isDerived = true };
};

int main()
{
    cout << ((IsDerived<Base&, Derived&>::isDerived) ? "true" : "false")
         << endl;
    cout << ((IsDerived<const Derived*, const Base*>::isDerived) ?
            "true" : "false") << endl;

} 
Run Code Online (Sandbox Code Playgroud)

Nik*_*sov 7

检查提升类型特征,特别是is_base_of模板.


Ben*_*igt 7

我总是只使用指针初始化.指针隐式转换为超类型(可能是身份转换或公共基类),因此除非存在该关系(并且方向正确),否则它将无法编译.

例如

Parent* p = (Possibly_Derived*)0;
Run Code Online (Sandbox Code Playgroud)

哦等等,你不想让编译失败,而是设置一个变量?这里:

template<typename TParent>
bool is_derived_from( TParent* ) { return true; }

template<typename TParent>
bool is_derived_from( void* ) { return false; }

cout << is_derived_from<Parent>( (Possibly_Derived*)0 );
Run Code Online (Sandbox Code Playgroud)

这是一个演示:http://ideone.com/0ShRF