2011-04-19 23 views
10

C++ içindeki typeid işleci, metin adını verebilen std::type_info sınıfının bir nesnesini döndürür. Bununla birlikte, sadece herhangi bir polimorfik sınıf için benzersiz bir sayısal tanımlayıcı almakla ilgileniyorum. (Tek bir programı çalıştırmak kapsamında benzersiz - ille koşular arasında) UygulamadaTypeid aracılığıyla bir sınıfın sayısal benzersiz tanıtıcısı

, sadece ve pointer KQUEUE vptr 'ın içeriğini okuyabilir - ama bu zarif ne de taşınabilir ne olurdu. Ben portatif bir yol tercih ederim.

typeid işlecini bir şekilde bir sınıf için "güvenli" sayısal tanımlayıcısına sahip olmak için kullanabilir miyim? Örneğin, verilen bir sınıftaki her bir typeid çağrısı için aynı olmak üzere std::type_info yapısının adresine güvenebilir miyim? Ya da belki de name() işaretçisinin kendisi? Bir sayaç kullanan bir algoritma ile başlatılan statik veri üyesi

+0

. Bu bir dizgi değişmezi olduğundan, derleme zamanında da çözülmelidir. En azından bu “Gem” den bu fikri nereden aldığımı söylüyor ... benim deneyimim farklı. Benim için, bu çözümün yükü kabul edilemez derecede yüksektir. Ama, kesinlikle taşınabilir, bu yüzden ... evet. – Damon

+0

Burada gerçekten ne gibi bir problem çözmeye çalışıyorsunuz? –

+0

Nesnenin adresini “void **” ye dönüştürmeye ve vptr için dizelemeye direnmeye çalışmamın sorunu. : D Ve daha ciddi - 2 boyutlu bir vtable ile benzer bir şey. – Kos

cevap

1

görünüyor.

+9

Dikkat! Standart olarak: hash_code() iki farklı tür için farklı kimlikler göndermeye gerek yoktur. Bu bir karma kod bir anahtar değil. –

+0

Yani benzersiz olması garanti değil mi? – GameDeveloper

+0

-1 yanlış. (yukarıdaki Christopher'a bakınız) – Petter

0

Sonra MyClass :: id'i benzersiz tanımlayıcı olarak kullanın. Ve sonra temel tanıma dayalı benzersiz tanımlayıcıyı almak için sanal işlevleri kullanın. Taşınabilir olmayı garantilemekle birlikte, hem statik değişkeni uygulamak hem de oluşturduğunuz her yeni sınıf için sanal işlevi uygulamak gerektiğinden, hafif bir bakım yükü vardır. Ama sanırım bu zaten büyük bir sorun değil çünkü zaten C++ 'yu kullanmayı tercih etmişsiniz. Bu şuna benzer: type_info::hash_code() C++ 0x için reçete gibi

class Base { virtual int get_id() const=0; }; 
class Derived : public Base { static int id; int get_id() const { return id; } }; 
int algo() { static int count=0; count++; return count; } 
static int Derived::id = algo(); 
+2

Mümkün, fakat böyle bir kodu yazmam ve sürdürmem gerekmediği için RTTI icat edilmedi mi? Bunu yapmak için derleyicinin işi, benim değil. – Kos

+0

iyi, bu noktada C++ 'da gerçekten daha iyi kodlar elde edersiniz, eğer gerçekten iş yaparsanız ve daha büyük miktarda boilerplate kodu yazarsanız. – tp1

4

type_info, tanımladığı türün başka bir type_info nesnesinin türüyle karşılaştırılması için bir operatöre ==() sahiptir. Nesnelerin programdan da çıkma garantisi vardır.

Yani, iki type_infos adreslerini kaydederseniz, aynı türden başvuruda bulunup bulunmadığını görmek için *p1 == *p2 ile kurtulursunuz. Değerleri türüne göre depolamak için kapsayıcılarda

İlgili konular