为简洁起见,这是简化的层次结构:
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
Run Code Online (Sandbox Code Playgroud)
并且有一个函数来确定指向类的特定指针是否实现了传递的"接口":
template<typename T>
bool same(IBase* base)
{
if(std::is_base_of<T, decltype(*base)>::value)
return true;
return false;
};
Run Code Online (Sandbox Code Playgroud)
样本:
IDerived* i(new Derived());
bool isSame = same<IDerived>(i);
Run Code Online (Sandbox Code Playgroud)
我知道我可能decltype在这里误用了.它似乎无论我尝试什么,std::is_base_of<B,D>::value总是如此false.我想要这个功能做的是,回答问题:
对象是否指向派生自T作为模板参数传递的type()?
decltype,比如sizeof,是一个编译时构造.这意味着,decltype(*base)将得到的静态型的表达的*base是IBase.所以你打算实现的目标不能这样做.
我会建议这个解决方案:
template<typename T>
bool same(IBase* base)
{
return dynamic_cast<T*>(base) != nullptr;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1072 次 |
| 最近记录: |