在Perl中,有一个UNIVERSAL :: can方法可以调用任何类或对象来确定它是否能够执行某些操作:
sub FooBar::foo {}
print "Yup!\n" if FooBar->can('foo'); #prints "Yup!"
假设我在C ++中有一个基类指针,它可以是许多不同的派生类中的任何一个,是否有一种简单的方法可以实现与此类似的东西?我不想触及其他派生类中的任何内容,我只能更改调用该函数的基类中的区域,以及支持它的派生类。
编辑:等等,现在这是显而易见的(永远不要回答问题),我可以在基数中实现它,返回一个代表UNIMPLEMENTED的数字,然后在调用它时检查返回是不是这个。我不确定为什么我会以如此复杂的方式思考问题。
我还在想我会从另一个实现foo
的类派生我的类,然后看看这个类的动态转换是否有效。
答案 0 :(得分:7)
如果你有一个指向基类的指针或引用,你可以使用dynamic_cast
来查看它是哪个派生类(以及它支持的派生类的方法)。
答案 1 :(得分:5)
如果可以向基类添加方法,则可以添加virtual bool can_foo() {return false;}
并在具有foo的子类中覆盖它以返回true。
答案 2 :(得分:3)
C ++没有内置的运行时反射。您可以完全自由地在类层次结构中构建自己的反射实现。这通常涉及一个静态地图,其中填充了一系列名称和功能。您必须手动注册所需的每个函数,并且具有调用约定和函数签名的一致性。
答案 3 :(得分:2)
我认为最正确的方法是使用typeid<>运算符并获取对type_info对象的引用,然后您可以将该(==运算符)与您希望关注的数据类型的所需type_info进行比较。
这不会给你方法级别的检查,并且确实要求你在启用RTTI的情况下构建(我相信在没有RTTI的情况下使用“未定义”行为构建的对象上使用typeid<>),但你有。
MSDN有一个在线参考,可以帮助您入门:http://msdn.microsoft.com/en-us/library/b2ay8610%28VS.80%29.aspx