gpt4 book ai didi

c++ - 在类层次结构上使用 std::is_base_of 和 decltype

转载 作者:太空宇宙 更新时间:2023-11-04 15:26:07 27 4
gpt4 key购买 nike

为简洁起见,这是简化的层次结构:

class IBase
{
public:
virtual ~IBase() = 0 { };
}; // eo IBase


class IDerived : public virtual IBase
{
public:
virtual ~IDerived() = 0 { };
}; // eo IDerived

class Base : public virtual IBase
{
public:
Base() { };
virtual ~Base() { };
}; // eo Base


class Derived : public IDerived
, public Base
{
}; // eo Derived

还有一个函数来确定指向类的特定指针是否实现了传递的“接口(interface)”:

template<typename T>
bool same(IBase* base)
{
if(std::is_base_of<T, decltype(*base)>::value)
return true;
return false;
};

和示例:

IDerived* i(new Derived());
bool isSame = same<IDerived>(i);

我知道我可能会误用 decltype这里。似乎无论我尝试什么,std::is_base_of<B,D>::value总是 false .我想要这个函数做的是,回答问题:

指向的对象是否派生自作为模板参数传递的类型 ( T)?

最佳答案

decltypesizeof 一样,是一个编译时结构。这意味着,decltype(*base) 将给出表达式 *basestatic 类型,即 IBase。因此,您无法通过这种方式实现您想要实现的目标。

我会建议这个解决方案:

template<typename T>
bool same(IBase* base)
{
return dynamic_cast<T*>(base) != nullptr;
};

关于c++ - 在类层次结构上使用 std::is_base_of 和 decltype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7967798/

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