2010-11-16 12 views
17

Derleyicilerin std::type_info işlevlerinin davranışlarını uygulamada daha fazla özgürlüğü olduğunu biliyorum.C++: türlerini ayırt etmek için type_info

Ben nesne türlerini karşılaştırmak için kullanıyorum düşünüyorum, bu yüzden emin olmak istiyorum:

  1. std::type_info::name iki farklı türleri için iki farklı dizeleri geri dönmelidir.

  2. std::type_info::beforeType1 önce olduğunu Type2Type2özel veya daha önceType1 olduğunu söylemek gerekir. Aynı şablon sınıfının

    // like this: 
    typeid(T1).before(typeid(T2)) != typeid(T2).before(typeid(T1)) 
    
  3. İki farklı uzmanlık farklı türleri olarak kabul edilir. Aynı türdeki iki farklı typedef -inandı aynı türdür.

Ve nihayet: (a std::map örn) std::type_info yana

  • yere type_info s saklamak nasıl, copyable değil mi? std::type_info'a sahip olmanın tek yolu her zaman bir yere (örneğin: yığında veya statik/global değişkende) ayrılmış ve ona bir işaretçi kullanmış mıdır?

  • Ne kadar hızlı operator==, operator!= ve en yaygın derleyicilerde before nelerdir? Sanırım sadece bir değeri karşılaştırmalılar. Ve ne kadar hızlı typeid?

  • virtual bool operator==(const A&) const numaralı bir A sınıfım var. Bu tür uygulamak için kabul edilebilir (ve standart) yolu mu

    virtual bool operator==(const A &other) const { 
        if(typeid(*this) != typeid(other)) return false; 
        // bool B::operator==(const B &other) const // is defined for any class B 
        return operator==(static_cast<B&>(other)); 
    } 
    

    : A yana birçok alt sınıfları var (ki bazıları derleme zamanında bilinmeyen), herhangi bir alt sınıfta B bu şekilde bu sanal operatörünü aşırı ediyorum Şebeke?

+0

Bölüm 2 ile ilgili not: kesinlikle typeid (Type1) == typeid (Type2) değilse, diğer bir deyişle bunlar farklı türde değil ;-) –

cevap