如何在C++中输入

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(...)的情况呢?

dav*_*veg 7

您可以使用dynamic_cast来测试类型,如下所示:

IPlugin* iPluginPtr = NULL;
iPluginPtr = dynamic_cast<IPlugin*>(somePluginPtr);

if (iPluginPtr) {
    // Cast succeeded
} else {
    // Cast failed
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,换句话说,语言必须是C++.标准C++包括RTTI.编译器允许您将其关闭的事实不应该是相关的.这样做是非标准行为.如果您开始禁用部分语言,*当然*依赖它的代码将无效.你不妨指出代码必须被提供给C++编译器,而不是Fortran或C. (13认同)
  • 请记住,必须启用RTTI才能使其正常工作. (2认同)

Cha*_*les 5

此行为称为RTTI(运行时类型信息).这种技术最好避免,但在某些情况下可能是有益的.

有两种方法可以解决这个问题.第一种方法是使用纯虚函数编写一个接口,该函数返回特定于类的整数引用代码.然后,此代码可用于表示特定类型.这些整数可以存储在特定的枚举中.

在派生类中,您可以覆盖该方法并返回该类特定类型.在运行时,您可以调用Plugin-> getType(),它将返回其特定类型.然后,您可以对指针执行static_cast,以获取派生类型的正确指针.

第二种方法是使用typeid来获取对象的classtype; 但这取决于编译器.您也可以尝试使用dynamic_cast来投射指针; 当dynamic_cast被转换为错误的类型时,它返回一个空指针; 当以正确的类型进行投射时,它是有效的.动态强制转换方法比上面描述的getType方法具有更大的开销.


csl*_*csl 2

如果您想要完全类似 typeof 的行为,则必须使用RTTI(运行时类型信息)。在许多编译器上,您必须显式激活 RTTI 的使用,因为它会产生运行时开销。

然后您可以使用typeiddynamic_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。