为简洁起见,这是简化的层次结构:
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
)?
答案 0 :(得分:6)
decltype
一样, sizeof
是一个编译时构造。这意味着,decltype(*base)
将为*base
提供表达式IBase
的静态类型。所以你打算实现的目标不能这样做。
我会建议这个解决方案:
template<typename T>
bool same(IBase* base)
{
return dynamic_cast<T*>(base) != nullptr;
};
答案 1 :(得分:1)
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
。