在类层次结构上使用std::is_base_of和decltype
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
(
decltype
和sizeof
一样,是一个编译时构造。这意味着,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
。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Why is UINT32_MAX + 1 = 0?
- C++错误:"error: int aaa::bbb is protected within this context"
- 构造函数采用 Base&不被调用
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 将sharet_ptr<Derived>转换为shared_ptr<Base>
- 尝试应用肖恩父母谈话"inheritance is the base class of evil"中的模式
- C++中的继承,"...is an ambiguous base of ..."错误
- 为什么在使用dynamic_cast和模板时出现错误"A is an inaccessible base of B"?
- what is Base*(*)()
- 不断收到错误"member reference base type 'string [1000]' is not a structure or union"不知道如何解决?
- C++错误,显示创建链接列表调用"error LinkedList Interface is an inaccessable base of linkedlist"
- 子构造函数无法识别基类的成员:平均值,西格玛"is not a nonstatic data member or base class"
- 为什么这段代码会出现"exception spec is more lax than base"错误?
- 如何在C++实现继承并解决错误"parent class is not accessible base of child class"?
- 关于肖恩·帕伦特谈话的澄清 "Inheritance is the base class of evil"
- 实现观察者模式的问题:"Member reference base type ________ is not a structure or union"
- 我怎么能说"noexcept if execution of protected base constructor is noexcept"?
- "Is not a direct base of " GCC 4.5.2 编译器错误