C++ 如何存储类型信息

C++ 如何存储类型信息,c++,C++,我想要一个列表来存储类的类型。有解决方案吗?您不能直接实例化类型为\u info类的对象,因为该类只有一个私有副本构造函数。由于列表需要复制构造函数 如果您确实需要它,请使用std::list 我不知道你为什么需要这个列表,但我会考虑一种替代设计,如果可能的话,不涉及RTTI。你不能创建“type\u info”对象的副本。但是,如果“typeid”是左值,并且相应的“type_info”对象一旦获得,其结果将继续有效,直到程序结束。由于这些原因,您可以在列表中安全地存储指向“type_info

我想要一个列表来存储类的类型。有解决方案吗?

您不能直接实例化类型为\u info类的对象,因为该类只有一个私有副本构造函数。由于列表需要复制构造函数

如果您确实需要它,请使用std::list


我不知道你为什么需要这个列表,但我会考虑一种替代设计,如果可能的话,不涉及RTTI。

你不能创建“type\u info”对象的副本。但是,如果“typeid”是左值,并且相应的“type_info”对象一旦获得,其结果将继续有效,直到程序结束。由于这些原因,您可以在列表中安全地存储指向“type_info”对象的指针

从您对Cătălin Pitiș的回答的评论中,我了解到您的目标是编写一个函数,为不同的“页面”类型返回不同的“样式”类型。这必须是动态的吗?如果不是,像这样的东西能满足你的需要吗

  class A {}
  A a;
  type_info info = typeid (a); // error type_info is private
模板
结构风格;
模板
结构样式{
typedef StyleA类型;
};
模板
结构样式{
typedef-StyleB型;
};
//等等。。。
模板
typename StyleOf::type
GetStyle(const PageT&){
返回StyleOf::type();
}
或:

使用boost::mpl::map;
使用boost::mpl::pair;
typedef映射<
一对
一对
//等等。
>
页面样式;
从页面类型获取样式类型是:

using boost::mpl::map;
using boost::mpl::pair;

typedef map<
    pair<PageA, StyleA>,
    pair<PageB, StyleB>,
    //etc.
>
PageToStyle;
boost::mpl::at::type;

实际上,我的目的是制作一张地图。给定一个实例化另一个类型的typeinfo。示例用法:Get(typeof(PageA))给了我一个StyleA类,那么你真的应该使用你自己创建的类ID。如果你知道你在编译时处理PageA,你应该在PageA里面放一个typedef。示例:类PageA{public:typedef StyleA style_t;//..};然后,当您想要实例化适当的样式时,只需执行:“PageA::Style\u t mystyleinstance;”。我似乎记得为非多态类型(包括内置类型)获取typeid是正常的。当然,我不知道如何使用这样的映射来实例化任何东西。我认为OP可能也会调查工厂模式,“仅针对多态性”部分是不正确的为所有类型生成“类型信息”。没有例外。对于多态类型,唯一特定的是,对于多态类型,“typeid”将标识对象的动态类型,而对于非多态的其他类型,它描述对象的静态类型。“启用/禁用RTTI”是编译器特有的功能,在语言级别上不存在。通常,禁用RTTI只会使“typeid”返回多态类的静态类型。可能的重复
using boost::mpl::map;
using boost::mpl::pair;

typedef map<
    pair<PageA, StyleA>,
    pair<PageB, StyleB>,
    //etc.
>
PageToStyle;
boost::mpl::at<PageToStyle, Page>::type;