Есть ли в C ++ аналог C # Type для хранения типов классов в списке / массиве? - PullRequest
3 голосов
/ 14 февраля 2012

В C # я могу создать такой список для хранения типов классов:

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

Могу ли я сделать то же самое в C ++?

Ответы [ 3 ]

1 голос
/ 14 февраля 2012

Вы можете сохранить список типов с помощью 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.

1 голос
/ 14 февраля 2012

Также возможно создавать экземпляры динамически. Вдохновляющий, но неполный код:

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 является дискуссионным.

Вы можете получить больше фантазии с помощью шаблонов с переменным числом аргументов (см., Например, функции emplace[_(front|back)] в C ++ 11), но это станет сложным, поскольку шаблоны виртуальных функций недопустимы, но вам все равно придется каким-то образом передавать списки аргументов.

(sidenote: boost::shared_ptr использовать аналогичное сочетание виртуальных / шаблонов, поэтому вы можете использовать с ним неполиморфные базовые классы и пользовательские средства удаления)

1 голос
/ 14 февраля 2012

См. typeid и type_info.

Обратите внимание, что вы не можете использовать класс type_info для создания новых экземпляров представляемого им типа., поскольку C ++ не поддерживает это.

...