2012-05-08 18 views
5

C++ 11'de A türünde bir değişkenin örtülü olarak using std::is_convertible<A, B> tarafından B tipine dönüştürülüp dönüştürülemeyeceğini belirlemek mümkündür.std :: is_convertible type_info için

Aslında A ve B türlerini biliyorsanız, ancak hepsi elimde type_infos ise iyi çalışır.

bool myIsConvertible(const type_info& from, const type_info& to); 

o C++ böyle bir şey uygulamak mümkün mü: Ben böyle bir fonksiyon için olduğu aradığım şey? Öyleyse nasıl?

+5

Bunun mümkün olduğunu düşünmüyorum. Ama asıl soru, böyle bir işlevle ne yaparsınız? – Nawaz

+0

Ayrıca, neden sadece 'type_info' var? – mfontanini

+0

"Eğer A ve B tiplerini biliyorsanız, bu iyi çalışır".Tamam, ama nasıl oluyor da türleri bilmiyorsun? – jrok

cevap

1

Bu, değişkeninizin typeidini biliyorsanız, C++ 'da typeid operatörünü kullanarak her zaman bildiğiniz gibi yapılabilir.

Derived* pd = new Derived; 
    Base* pb = pd; 
    cout << typeid(pb).name() << endl; //prints "class Base *" 
    cout << typeid(*pb).name() << endl; //prints "class Derived" 
    cout << typeid(pd).name() << endl; //prints "class Derived *" 

Sonra oluşturmak zorunda olan bir multimap veya convertible type ids (convertable tipi) olarak ve değer (dönüştürülebilir olup olmadığını bilmek istiyorum) typeid olarak anahtarla Nerede olursa gibi. Burada bu durumda const type_info& from numaralı keyconst type_info& to ile eşlenmiş olup olmadığını bulmak için haritaya ulaşabilirsiniz. Evet ise boole true veya false olarak dönebilirsiniz. Ancak bu durumda, tüm sınıfları ve kodda kalıtımı doğru şekilde gördüğünüzden emin olmalısınız. Ve temel olarak, yasal bir dönüşüm olup olmayacağına karar verir ve haritaya bu temelde ekler. Ama bu sıkıcı bir süreç olurdu ve bunun hiçbir kullanımını görmüyorum.

Genel anlamda C++, bir tür başka bir türe dönüştürülebilir veya düzgün bir şekilde yüklenemezse dynamic cast aracılığıyla size bilgi verir. static_cast, birbiriyle uyumsuz türler bile yayınlayacaktır ve bunun yanlış kullanımı, çalışma zamanı hatasına neden olur

4

Taşınabilir C++ 'da istediğiniz şeyi yapmak mümkün değildir.

O belirli bir platforma kendinizi kısıtlamak eğer kısmi bir cevap elde etmek mümkün olabilir. Örneğin Itanium ABI bağlı olan platformlar, bu işlev bir uygulama olacaktır: Bu ABI olarak

extern "C" 
void* __dynamic_cast(const void *sub, 
        const abi::__class_type_info *src, 
        const abi::__class_type_info *dst, 
        std::ptrdiff_t src2dst_offset); 

, abi::__class_type_info bir std::type_info türetilen türü ve programında tümstd::type_info s dinamik türü türetilmiş var? std::type_info'dan (abi::__class_type_info sadece bir örnek).

Bu ABI'yi kullanarak, std::type_info değerini vererek, herhangi bir türde (çalışma zamanında) devralma hiyerarşisinde gezinecek bir araç oluşturmak mümkündür. Ve bunu yaparken, iki std::type_info s, dynamic_cast veya hatta static_cast olabilen iki türü temsil edip etmediğinizi belirleyebilirsiniz.

Böyle bir çözümün, dönüştürücü bir kurucu veya dönüşüm işlecini kullanan türler arasında dönüştürmeyi hesaba katmayacağını unutmayın. Ve bu kısıtlama kabul edilebilir olsa bile, bu rotayı önermiyorum. Bu kolay bir proje değildir ve çok hataya eğilimlidir. Ancak bu muhtemelen C++ uygulamanızın dynamic_cast'u nasıl uyguladığıdır, bu yüzden açıkça imkansız değildir.

İlgili konular