可以用C ++传递“类型”吗?

时间:2010-11-22 01:38:22

标签: c++ c++11

[这个问题的后续内容:可以在C ++中给出它的类型来实例化对象吗?

在Java中,您可以使用类型为Class的方法参数,并且调用者可以传入Foo.class。我不考虑这方面的反思,虽然你可以用传入的类做什么显然是。 C ++有没有传递“类型”的机制?因为我知道我用传入类型做的很少/没有,我怀疑答案是“不”。

显然,模板提供了这种功能,但它们并不是我想要的。

3 个答案:

答案 0 :(得分:3)

听起来像RTTI(运行时类型识别)就是你要找的东西。来自http://en.wikibooks.org/wiki/C++_Programming/RTTI

  

用于确定的typeid运算符   运行时对象的类。它   返回对a的引用   std :: type_info对象,它存在   直到该计划结束,那   描述了“对象”。

答案 1 :(得分:0)

没有。此功能是“反射”的一部分,只能在Java等语言中实现,它实际上将有关类的信息放入已编译的二进制文件中。

C ++(通常)实际上并不在结果二进制文件中存储有关类的任何信息。 (除了std::type_info工作所需的几个位)

实际上,没有像Java和朋友在C ++中提供的“类型”那样,因此你无法将它传递给方法。

如果你想将一个类型传递给一个方法来实例化它,你实际上可以用更好的方式做到这一点(这也适用于Java和朋友)

#include <memory>

struct IMyType
{
    virtual ~IMyType();
    virtual MyMethod();
};

struct IElementFactory
{
    virtual std::auto_ptr<IMyType> GetNewItem() const = 0;
    virtual ~IElementFactory();
};


void MyMethodThatAcceptsAType(const IElementFactory& factory)
{
    std::auto_ptr<IMyType> instance(factory.GetNewItem());
    //Use your instance like normal.
}

即使在Java领域也是如此,因为这段代码可以保持类型安全,而基于反射的代码则不然。

答案 2 :(得分:0)

RTTItypeid怎么样?