gpt4 book ai didi

c++ - 在编译期间检测继承

转载 作者:可可西里 更新时间:2023-11-01 17:29:47 28 4
gpt4 key购买 nike

我无法弄清楚为什么此代码返回 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);}
};

我在 Stropstrup 的主页上找到了上面的代码片段。但是,如果派生类不是从 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;

}

最佳答案

我总是为此使用指针初始化。指针仅隐式转换为父类(super class)型(可以是身份转换或公共(public)基类),因此除非存在这种关系(并且方向正确),否则它不会编译。

例如

Parent* p = (Possibly_Derived*)0;

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

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 );

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

关于c++ - 在编译期间检测继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4529102/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com