C++是否有一些类似C#类型的东西来存储列表/数组中的类类型

本文关键字:类型 存储 列表 数组 是否 C++ | 更新日期: 2023-09-27 18:24:25

在C#中,我可以创建这样的List来存储类类型:

List<Type> types_list = new List<Type>();
types_list.add(typeof(int));
types_list.add(typeof(Process)); //and etc

我能在C++中做同样的事情吗?

C++是否有一些类似C#类型的东西来存储列表/数组中的类类型

参见typeidtype_info

请注意,不能使用type_info类来创建它所代表的类型的新实例,因为C++不支持这样做。

您可以使用boost MPL存储类型列表。示例:

#include <boost mpl stuff>
int main()
{
   typedef boost::mpl::vector<char, int> types;
   typedef boost::mpl::push_back<types, Process>::type newTypes;
   boost::mpl::at_c<newTypes, 2>::type objectOfTypeProcess;
}

除非你知道自己在做什么,否则你真的不应该使用这个库,所以我的例子没有那么具体。无论如何,你可能需要花一些时间来适应mpl。

还可以动态创建实例。鼓舞人心但不完整的代码:

class TypeProxy {
public:
    virtual ~TypeProxy() = default;
    char* create_default() const { return this->create_default_impl(); }
    template <typename T>
    static scoped_ptr<TypeProxy> CreateProxy ();
private:
    virtual void* create_default_impl() const = 0;
};

// A creator class.
template <typename T>
class Concrete : public TypeProxy {
    void *create_default_impl() const {
        return new T ();
    }
};

// Method to create creator proxies.
template <typename T>
scoped_ptr<TypeProxy> TypeProxy::CreateProxy () {
    return scoped_ptr<TypeProxy> (new Concrete<T>());
}

请注意,这只是一些未经测试的临时代码,用于显示操作模式。是否使用scoped_ptr是有争议的。

你可以更喜欢可变模板(例如,参见C++11中的emplace[_(front|back)]函数),但它会变得复杂,因为不允许使用虚拟函数模板,但无论如何你都必须传递参数列表。

(旁注:boost::shared_ptr使用类似的虚拟/模板组合,这就是为什么您可以使用非多态基类和自定义deleter)