Можно ли передать «тип» в C ++? - PullRequest
2 голосов
/ 22 ноября 2010

[Ответ на этот вопрос: возможно ли создать экземпляр объекта с учетом его типа в C ++?

В Java вы можете иметь параметр метода типа Class, и вызывающие могут передавать в Foo.class.Я не рассматриваю этот аспект отражения, хотя очевидно, что вы можете сделать с переданным классом.Есть ли в C ++ какой-либо механизм для передачи «типа»?Поскольку я знаю, что с этим переданным типом я мало что могу сделать, я подозреваю, что ответ «нет».

Очевидно, что шаблоны предоставляют эту возможность, но это не то, что я ищудля.

Ответы [ 3 ]

3 голосов
/ 22 ноября 2010

Похоже, RTTI (идентификация типа во время выполнения) - это то, что вы ищете.С http://en.wikibooks.org/wiki/C++_Programming/RTTI:

Оператор typeid, используемый для определения класса объекта во время выполнения.Он возвращает ссылку на объект std :: type_info, который существует до конца программы, который описывает «объект».

0 голосов
/ 22 ноября 2010

Как насчет RTTI и typeid?

0 голосов
/ 22 ноября 2010

Нет.Эта функция является частью «отражения» и возможна только в таких языках, как Java, которые фактически помещают информацию о классах в скомпилированный двоичный файл.

C ++ (обычно) вообще не сохраняет никакой информации о классах в результирующемдвоичный файл.(За исключением нескольких битов, необходимых для работы std::type_info)

На самом деле, нет ничего похожего на «Тип», предоставляемый Java и друзьями, доступными в C ++, и поэтому вы не можете передать его методу.

Если вы хотите передать тип методу с целью его создания, вы можете сделать это лучше (это работает и с Java, и с друзьями)

#include <memory>

struct IMyType
{
    virtual ~IMyType();
    virtual MyMethod();
};

struct IElementFactory
{
    virtual std::auto_ptr<IMyType> GetNewItem() const = 0;
    virtual ~IElementFactory();
};


void MyMethodThatAcceptsAType(const IElementFactory& factory)
{
    std::auto_ptr<IMyType> instance(factory.GetNewItem());
    //Use your instance like normal.
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...