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++中做同样的事情吗?
参见typeid
和type_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)