繁体   English   中英

在类层次结构上使用带有decltype的std :: is_base_of

[英]Using std::is_base_of with decltype on class hierarchy

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

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

sizeof一样, decltype是一个编译时构造。 这意味着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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM