是否可以在c ++中创建类型向量?

时间:2013-12-17 18:40:57

标签: c++ c++11

是否可以在c ++中创建类型向量?

也许c ++ 11中的decltype可以用于此吗?

我需要这个,以便我可以迭代这个向量,取类型, 这是类,并创建这样的实例。

4 个答案:

答案 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