2014-11-07 10 views
8

Standart, std::type_index(typeid(obj)) numaralı bir çağrının bu türe özgü olacağını öngörüyor mu? Bu konuda bilgi bulamadım.std :: type_index, derleyicim için benzersiz olup olmadığını nasıl öğrenebilirim?

türünün adını içeren bir uygulama tanımlı boş sonlandırılmış karakter dizesini İade: type_info::name() itibaren ben hallederim. Hiçbir garanti verilmez, , döndürülmüş dize, aynı türden programların çağırmaları arasında çeşitli tipler ve değişimi için aynı olabilir.

(kaynak: http://en.cppreference.com/w/cpp/types/type_info/name)

belki ezilmiş adları/typeids değil mutlaka benzersiz olmasını beni inandıramaz. Ancak, std::type_index numaralı sayfa özellikle bu türlerin "usage example" bölümünde yer alan varsayımını kabul eder.

Derleyicim için typeid'un benzersiz olup olmadığını ve bir çarpışma olasılığının ne olduğunu nasıl bilebilirim? Ayrıca, 'un bildiğimiz bir tür tanımlayıcı (bir dizi veya başka bir şekilde) türüne özgü bir yolu var mıdır? çok büyük türleri için çok yavaş olduğu için

demangling bir seçenek değildir, ama benim tahminim uygulaması bir isim demangle için bir imkan sunmaktadır, sonra parçalanmış adı o uygulanmasında türü için benzersiz olması gerektiğidir neyse, doğru mu?

+0

@ 0x499602D2 tamam Sanırım biraz şaşırdım, daha net yapmaya çalıştım. – arman

+0

Boost.TypeIndex dosyasına bakmak isteyebilirsiniz - Kişisel olarak kullanmadım, ancak dokümanlar RTTI devre dışı bırakılmış olsa bile çalıştıklarını söylüyor –

+0

'type_info' ile ilgili sorun nedir? İsimler, onları sipariş etmenin doğru yolu değil, '==' ve 'önce '. Ve 'type_index' asla isimden bahseder mi? – Yakk

cevap

6

type_info numaralı "name" işlevi, yararlı olmak için garanti kapsamında değildir. Bir uygulama muhtemelen her şey için ""'u iade edebilir ve uyumlu olabilir. Pratikte her zaman "" değildir ve sadece hata ayıklama için kullanılabilir.

Ancak type_info== ve before ve hash_codename güvenmeyin.

type_index (vs, depolanan, kopyalanabilir) normal bir türü üretmek için bilgi yöntemlerini kullanan bir type_info bir işaretçi etrafında sarıcı. Farklı tipler için farklıdır.

+0

Ancak bu garanti, karı için de yoktur, [this] 'a göre (http://en.cppreference.com/w/cpp/types/type_info/hash_code): _'type_info' nesneleri farklı türlere başvurabilir. aynı hash_code (standart, uygulamaların mümkün olduğu kadar önlenmesi için önerilmesine rağmen) _ – ricab

+0

@ricab Evet. Böylece 'hash_code' ile erken çıkış için karşılaştırıyorsunuz ve eğer çift eşittir '==' ile kontrol ediyorsanız. Ya da sadece '==' yapın ve uygulamanın kalitesini varsayın.Veya bir 'typeindex 'oluşturun ve ona güvenin. – Yakk

İlgili konular