C ++: type_info для различения типов

Я знаю, что компиляторы имеют большую свободу в реализации std :: type_info поведение функций.

Я подумываю использовать его для сравнения типов объектов, поэтому я хотел бы быть уверен, что:

  1. std :: type_info :: name должен возвращать два разных строки для двух разных типов.

  2. std :: type_info :: before должен указывать, что Type1 равен до Type2 исключающее ИЛИ Type2 ] равен перед Type1 .

     // вот так:
    typeid (T1) .before (typeid (T2))! = typeid (T2) .before (typeid (T1))
    
  3. Две разные специализации одного и того же шаблонного класса считаются разными типами.

  4. Два разных typedef -иниций одного типа относятся к одному типу.

И, наконец:

  • Так как std :: type_info не копируется, как я могу сохранить где-нибудь type_info (например: в std :: map )? Единственный способ иметь всегда где-то std :: type_info (например: в стеке или статической / глобальной переменной) и использовать указатель на него?

  • Насколько быстро operator == , operator! = и перед в наиболее распространенных компиляторах? Я думаю, им следует сравнивать только стоимость. И насколько быстро typeid ?

  • У меня есть класс A с виртуальным оператором типа bool == (const A & ) const . Поскольку A имеет много подклассов (некоторые из которых неизвестны во время компиляции), я бы перегрузил этот виртуальный оператор в любом подклассе B следующим образом:

     virtual bool operator = = (const A и другие) const {
     if (typeid (* this)! = typeid (other)) return false;
     // bool B :: operator == (const B & other) const // определен для любого класса B
     оператор возврата == (static_cast  (другое));
    }
    

    Является ли это приемлемым (и стандартным) способом реализации такого оператора?

19
задан peoro 14 February 2018 в 18:19
поделиться