Vel*_*rho 5 c++ typeof rtti typeid
如何在C++中模拟C#typeof-command行为?
C#示例:
public static PluginNodeList GetPlugins (Type type)
{
...
}
Run Code Online (Sandbox Code Playgroud)
呼叫:
PluginManager.GetPlugins (typeof(IPlugin))
Run Code Online (Sandbox Code Playgroud)
如何使用C++实现这一点?也许QT或Boost库提供了解决方案?
如果你想以一种从文件(.so或.dll)加载那些类型的对象的方式实现.GetPlugins(...)的情况呢?
您可以使用dynamic_cast来测试类型,如下所示:
IPlugin* iPluginPtr = NULL;
iPluginPtr = dynamic_cast<IPlugin*>(somePluginPtr);
if (iPluginPtr) {
// Cast succeeded
} else {
// Cast failed
}
Run Code Online (Sandbox Code Playgroud)
此行为称为RTTI(运行时类型信息).这种技术最好避免,但在某些情况下可能是有益的.
有两种方法可以解决这个问题.第一种方法是使用纯虚函数编写一个接口,该函数返回特定于类的整数引用代码.然后,此代码可用于表示特定类型.这些整数可以存储在特定的枚举中.
在派生类中,您可以覆盖该方法并返回该类特定类型.在运行时,您可以调用Plugin-> getType(),它将返回其特定类型.然后,您可以对指针执行static_cast,以获取派生类型的正确指针.
第二种方法是使用typeid来获取对象的classtype; 但这取决于编译器.您也可以尝试使用dynamic_cast来投射指针; 当dynamic_cast被转换为错误的类型时,它返回一个空指针; 当以正确的类型进行投射时,它是有效的.动态强制转换方法比上面描述的getType方法具有更大的开销.
如果您想要完全类似 typeof 的行为,则必须使用RTTI(运行时类型信息)。在许多编译器上,您必须显式激活 RTTI 的使用,因为它会产生运行时开销。
然后您可以使用typeid或dynamic_cast来查找对象的类型。
如果您不想使用 typeid,则必须使用继承、指针和/或重载。Boost可能会对您有所帮助,但这并不难。
示例1:
class Iplugin { ... }
class Plugin1 : public Iplugin { ... }
class Plugin2 : public Iplugin { ... }
void getplugins(Iplugin* p) {
// ... you don't know the type, but you know
// what operations it supports via Iplugin
}
void getplugins(Plugin1& p) {
// expliticly handle Plugin1 objects
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,有多种方法可以避免使用 RTTI 和 typeid。
| 归档时间: |
|
| 查看次数: |
35735 次 |
| 最近记录: |