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

Using std::is_base_of with decltype on class hierarchy

本文关键字:is base of decltype std 层次 层次结构 结构上      更新时间:2023-10-16

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

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

以及一个函数,用于确定指向类的特定指针是否实现了传递的"接口":

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)将给出表达式*base静态类型,即IBase。因此,你想要实现的目标不能通过这种方式实现。

我建议这个解决方案:

template<typename T>
bool same(IBase* base)
{
     return dynamic_cast<T*>(base) != nullptr;
};
template<typename T>
bool same(IBase* base)
{
    if(std::is_base_of<T, decltype(*base)>::value)

这行不通。decltype(*base)将是IBase(始终(,因此它永远不会反映base的运行时类型。

也许你能做的最好的事情就是dynamic_cast<T*>(base)!=0

相关文章: