2011-06-15 31 views
8

Üretim kodunda typeid kullanmak genellikle kötü bir uygulama mıdır? Ayrıca, bazı meta verileri içeren (typeid) type_info döndürdüğünü fark ettim (türün adına sahip bir dize gibi); Bunu devre dışı bırakmanın bir yolu var mı?C++: Üretim kodunda typeid kullanma

+3

Büyük olasılıkla 'typeid' başvurularını bir kitaplık çağrısından döndürmek istemezsiniz. Eşleme işlemini kontrol ettiğiniz bir 'int 'gibi bir' typeid '' i başka bir şeye dönüştürmek için bir işlev yazmanız daha iyi olur. Ayrıca, 'typeid''in derleyici sürümünden sürümüne aynı kalacağı garantisi yoktur. Bu ayrıca, diskler arasında 'typeid 'saklamak istemediğiniz anlamına gelir, ancak çalışmaların arasında korunmayan bir önbellek dosyası dışında. –

cevap

8

Belirli bir dil özelliğini kullanmanın "kötü" veya "iyi" olup olmadığını söylemek zor. Gerçekten nasıl kullandığınıza bağlı. İş için doğru bir araçsa typeid'u kullanmayla ilgili yanlış bir şey yoktur, ancak çözdüğünüz herhangi bir sorun için daha iyi bir çözüm varsa, daha iyi bir çözüm için typeid'u kullanmaktan kaçınmalısınız.

typeid'u kullanmak genellikle iyi bir fikir değildir, çünkü kullanımı genellikle devralma ve sanal işlevler kullanılarak önlenebilir. Sisteminizi bu şekilde güncelleyebiliyorsanız, bunu yapmak iyi bir fikir olabilir.

numaralı ürününüzün std::type_info numaralı ürüne geri dönüp dönmemesine bağlı olarak, bu durum performans sorunlarına neden olmamalıdır. typeid, bir const std::type_info& değerini değerlendirir; dolayısıyla, içerdiği dize bilgilerinin tümünü kopyalamaz. Çoğu uygulama, nesnenin sanal işlev tablosunda saklanan gerçek std::type_info nesnesine sahiptir, böylece dahili olarak hiçbir kopyalama yapılmaz.

11
  1. Tipid ile ne yaptığınıza bağlı olarak değişir. Eğer polimorfizmi kullanman gereken yeri kullanıyorsan tabii ki bu kötü. Bununla birlikte, müşterilerin makinelerinde hata ayıklamak için izler ya da bunun gibi şeyleri boşaltma gayet iyi.
  2. Tek yol, derleyicinizde RTTI'yi devre dışı bırakmaktır. Bunu yapmanın standart bir yolu yok. Not Bu, dynamic_cast'u da devre dışı bırakır.
İlgili konular