如何在C ++中输入

时间:2009-10-08 20:03:09

标签: c++ rtti typeof typeid

如何在C ++中模拟C#typeof-command行为?

C#示例:

public static PluginNodeList GetPlugins (Type type)
{
 ...
}

呼叫:

PluginManager.GetPlugins (typeof(IPlugin))

如何使用C ++实现这一点?也许QT或Boost库提供了解决方案?

如果你想以一种从文件(.so或.dll)加载那些类型的对象的方式实现.GetPlugins(...)的情况呢?

8 个答案:

答案 0 :(得分:7)

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

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

if (iPluginPtr) {
    // Cast succeeded
} else {
    // Cast failed
}

答案 1 :(得分:5)

此行为称为RTTI (Run time type information)。这种技术最好避免,但在某些情况下可能是有益的。

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

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

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

答案 2 :(得分:2)

如果您想要完全类似行为,则必须使用RTTI (run-time type information)。在许多编译器上,您必须明确激活RTTI的使用,因为它会产生运行时开销。

然后,您可以使用typeiddynamic_cast来查找对象的类型。

如果您不想使用typeid,则必须使用继承,指针和/或重载。提升可能会帮助你,但这并不太难。

示例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
}

正如您所看到的,有几种方法可以避免使用RTTI和typeid。

答案 3 :(得分:2)

围绕这个问题进行设计将是最佳选择。良好地使用面向对象通常会有所帮助,但您总是可以创建自己的系统来查询对象的类型,例如使用存储每个对象的标识符的基类。

总是尽量避免使用dynamic_cast,因为它最常使用字符串比较来查找对象的类型,这使得它非常慢。

答案 4 :(得分:2)

您可以在GCC中使用typeof()。对于其他编译器,它可能不受支持,或者您必须进行疯狂的模板修改或使用特定于编译器的“bug-features”(如Boost所做的那样)。

答案 5 :(得分:1)

Boost确实有一个typeof。 C ++ 0x不会将其称为typeof,但同时具有提供相同功能的'auto'和'decltype'。

那就是说,我很确定在这种情况下,没有一个能提供你真正想要的东西 - 最多只能提供你需要/想要的一小部分。

答案 6 :(得分:1)

当然你会使用重载?

static PluginManager::GetPlugins(Type1 &x) {
  // Do something
}

static PluginManager::GetPlugins(Type2 &x) {
  // Do something else
}

然后致电:

PluginManager::GetPlugins(IPlugin);

答案 7 :(得分:0)

没有直接回答“如何在C ++中获取typeof()”,但我从你的问题中推断出你正在研究如何在C ++中使用插件。如果是这种情况,您可能会对(尚未)Boost.Extension库感兴趣,也可能感兴趣的是reflection部分。