2013-12-17 2 views
3

Можно ли создать вектор типов в C++?Можно ли создать вектор типов в C++?

Может быть, decltype в C++ 11 можно использовать для этого?

Мне нужно это, чтобы я мог перебирать этот вектор, возьмите тип, , который является классом, и создайте такой экземпляр.

+10

Во время компиляции? [Повышение :: MPL :: вектор] (http://www.boost.org/doc/libs/1_55_0/libs/mpl/doc/refmanual/vector.html). Во время выполнения? Неа. –

+2

Вам ответили на ваш [последний вопрос] (http://stackoverflow.com/questions/20639747/is-it-possible-to-iterate-over-all-elements-in-a-struct-or- класс), что это невозможно. – Praetorian

+0

Если вы хотите отражения, вы должны использовать язык с отражением. C++ - нет. У него также нет типа – Cornstalks

ответ

5

Вы можете создать фабричные шаблоны:

class BaseFactory { 
public: 
    virtual void* create() const = 0; 
}; 

template <typename T> 
class Factory :public BaseFactory { 
public: 
    T* create() const { 
     return new T(); 
    } 
}; 

И хранить такие экземпляры Factory в векторе. Однако я не вижу в этом большого смысла. Чтобы просто хранить типы в векторе, взгляните на boost MPL vector.

0

Вы не можете сделать это простым способом, но могут быть некоторые обходные пути. Я еще не в C++ 11 (моя IDE не поддерживает его, и я не могу изменить его ATM), но для старого 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; 
    } 
} 
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 

Это все довольно статичным, так как вы не можете изменить тип переменная динамически, поэтому, как только вы создаете экземпляр типа кортежа, его тип (и количество и типы его элементов) фиксирован.

+0

Кортежи также не хранят типы. Они также сохраняют ценности. –

+0

@BenjaminLindley: ну, да, но вопрос как поставленный - это нонсенс. «Типы» - это концепция времени компиляции, поэтому «хранение» их во время выполнения не имеет смысла. –

+0

@BenjaminLindley Но вы не можете вывести тип для определенного индекса 'std :: tuple' (во время компиляции)? –

0

Возможно, рассмотрите вектор (или карту) заводских функций. Однако функции фабрики должны иметь одну и ту же подпись, и им нужно будет вернуть какой-то указатель на базовый класс.

Ex.

// 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 
Смежные вопросы