是否可以在c ++中创建类型向量?
也许c ++ 11中的decltype可以用于此吗?
我需要这个,以便我可以迭代这个向量,取类型, 这是类,并创建这样的实例。
答案 0 :(得分:5)
您可以创建工厂模板:
class BaseFactory {
public:
virtual void* create() const = 0;
};
template <typename T>
class Factory :public BaseFactory {
public:
T* create() const {
return new T();
}
};
并将此类Factory实例存储在Vector中。但是,我没有太多使用它。要简单地将类型存储在向量中,请查看boost MPL vector。
答案 1 :(得分:0)
你不能以一种简单的方式做到这一点,但可能会有一些变通方法。我还没有进入C ++ 11(我的IDE不支持它,我也无法更改它),但对于旧的C ++,你可以使用typeid(a).name()
,其中a
是一个变量。您可以将函数的结果存储在vector
中,然后使用if-else构造创建变量。
或者 - 如果您只想初始化类的变量,那么从Base
类派生它们,该类具有返回类类型标识符的函数:
class Base{
int classId;
public:
Base(){classID=0;};
virtual int myType(){return classID;};
};
class Derived1: public Base{
public:
Derived1(){classID=1;};
等等。然后,您只需使用switch
语句创建对象:
vector<int> types;
// Populate the vector somewhere here
for(unsigned int i=0;i<types.size();i++){
Base* newObject;
switch(types[i].myType()){
case 0:
newObject = new Base;
break;
case 1:
newObject = new Derived;
break;
default:
newObject = 0;
}
}
答案 2 :(得分:0)
你是什么意思“类型的向量” - 向量包含数据值,而不是类型,所以问题没有多大意义。
你可以创建一个类型元组(元组有点像类型的向量而不是值):
typedef std::tuple<int, int, double, std::string> mytype; // typedef a tuple type
mytype foo(4, 3, 2.0, "hello"); // create an instance
double x = get<3>(foo); // get a value from that instance
get<2>(foo) = 7; // change a value in that instance
这都是非常静态的,因为你不能动态地改变变量的类型,所以一旦你创建了一个元组类型的实例,它的类型(以及它的元素的数量和类型)是固定的。
答案 3 :(得分:0)
也许考虑工厂功能的矢量(或地图)。然而,工厂函数都需要相同的签名,并且需要返回某种指向基类的指针。
实施例
// factory functions
// all take no parameters and return a pointer to a shape
unique_ptr<Shape> CreateCircle();
unique_ptr<Shape> CreateSquare();
unique_ptr<Shape> CreateTriangle();
std::vector<std::function<unique_ptr<Shape>()>> factoryVector =
{
&CreateCircle,
&CreateSquare,
&CreateTriangle
};
// You can now iterate over factoryVector, invoke the () operator on each element
// of the vector, and generate a Shape pointer that points to a Circle, Square, and
// Triangle