2013-11-20 2 views
0

Итак, я нашел это довольно хороший учебник о событиях в C++:обертка класс для type_info

http://www.gamedev.net/page/resources/_/technical/game-programming/effective-event-handling-in-c-r2459

НО: создатель использует обертку для type_info возвращаемого TypeID. Насколько я понимаю, это невозможно из-за недоступности оператора = type_info. Таким образом, я не могу скомпилировать код, который он предоставляет. К сожалению, это также основная часть того, как работает его учебник. Теперь, как бы я обошел эту проблему, должен ли я просто использовать type_info.hash_code - выполняет ли это эту работу, чтобы индивидуально идентифицировать класс? Или я не понял, что он подразумевает под «оберткой» в этом случае?

ответ

2

Единственное упоминание о type_info на этой странице

TypeInfo является простой оберткой type_info класса, который позволяет нам хранить его в качестве ключа в станде :: карта.

C++ 11 имеет std::type_index в <typeindex>, который выполняет именно эту роль. В общем случае элементы map не обязательно должны быть назначаемыми, как и для C++ 11, но нельзя использовать type_info, потому что вы просто не можете их построить, кроме выражения typeid.

В спецификации для std::type_index указано, что он может содержать указатель на std::type_info для упрощения реализации. «Обертка» не предполагает наследования или прямого членства.

Класс, который обертывается ссылкой, также известен как прокси-сервер .

+0

Итак, мне даже не нужна оболочка, я могу просто использовать type_index напрямую? – pixartist

+0

@ user1071988 Да, но это часть C++ 11. Вероятно, вы можете получить консервированную версию где-то еще. Если эта статья фактически не предоставляет источник или ссылку, это отвратительно, но проверьте обычных подозреваемых, таких как Boost. Легко писать, несмотря на указатель, потому что каждый объект 'type_info' имеет неопределенное время жизни. Вы можете просто инициализировать любой указатель '& typeid (foo)', потому что это уже указатель на глобальный. – Potatoswatter

0

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

class TypeInfo{ 
public: 
    explicit TypeInfo(const type_info& info) : _typeInfo(info) {}; 
    bool operator < (const TypeInfo& rhs) const{ 
     return _typeInfo.before(rhs._typeInfo) != 0; 
    } 
private: 
    const type_info& _typeInfo; 
}; 
Смежные вопросы