当前位置:  开发笔记 > 编程语言 > 正文

C++相当于instanceof

如何解决《C++相当于instanceof》经验,为你挑选了2个好方法。

实现C++等价的首选方法是instanceof什么?



1> Laserallan..:

尝试使用:

if(NewType* v = dynamic_cast(old)) {
   // old was safely casted to NewType
   v->doSomething();
}

这要求您的编译器启用rtti支持.

编辑:我对这个答案有一些好评!

每次你需要使用dynamic_cast(或instanceof)时,你最好问问自己这是否是必要的.这通常是设计不佳的标志.

典型的解决方法是将要检查的类的特殊行为放入基类的虚函数中,或者引入类似访问者的内容,您可以在不改变界面的情况下为子类引入特定行为(除了添加访问者接受接口)课程).

正如所指出的,dynamic_cast不是免费的.处理大多数(但不是所有情况)的简单且始终如一的执行hack基本上是添加一个枚举,表示您的类可以拥有的所有可能类型,并检查您是否拥有正确的类型.

if(old->getType() == BOX) {
   Box* box = static_cast(old);
   // Do something box specific
}

这不是好设计,但它可以是一种解决方法,其成本或多或少只是虚拟函数调用.无论是否启用RTTI,它都可以工作.

请注意,此方法不支持多级继承,因此如果您不小心,可能会以如下代码结束:

// Here we have a SpecialBox class that inherits Box, since it has its own type
// we must check for both BOX or SPECIAL_BOX
if(old->getType() == BOX || old->getType() == SPECIAL_BOX) {
   Box* box = static_cast(old);
   // Do something box specific
}


不要忘记dynamic_cast是一项成本高昂的操作.
有许多合理使用动态类型测试的例子.它通常不是首选,但它有一个地方.(否则,为什么它或它的等价物出现在每个主要的OO语言中:C++,Java,Python等?)
如果你必须使用instanceof,在大多数情况下,你的设计有问题.
当你进行"instanceof"检查时通常就是这种情况
如果不需要处理不同,我会在IOException级别捕获它们.如果需要对它们进行不同的处理,那么我会为每个异常添加一个catch块.

2> panzi..:

根据您的要求,您可以执行以下操作:

template
inline bool instanceof(const T*) {
    return std::is_base_of::value;
}

使用:

if (instanceof(ptr)) { ... }

但是,这纯粹依赖于编译器已知的类型.

编辑:

此代码应适用于多态指针:

template
inline bool instanceof(const T *ptr) {
    return dynamic_cast(ptr) != nullptr;
}

示例:http://cpp.sh/6qir


我已修改您的示例以编写此方法的一个版本,该版本使用引用而不是指针:http://cpp.sh/8owv
推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有