2012-05-08 2 views
5

C++ 11では、タイプAの変数がusing std::is_convertible<A, B>によって暗黙的にタイプBに変換できるかどうかを判断することができます。type_infoのstd :: is_convertible

これは実際にタイプAとタイプBを認識しているが、これはすべてtype_infosである場合にうまく機能します。だから私が探しているのは次のような関数です:

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

C++のようなものを実装することは可能ですか?もしそうなら、どうですか?

+5

私はそれが可能ではないと思います。しかし、本当の疑問は、あなたはそのような機能で何をしますか? – Nawaz

+0

また、なぜあなたは 'type_info'だけを持っていますか? – mfontanini

+0

"これは実際にタイプAとタイプBを知っているとうまくいきます"。しかし、どのようにタイプを知らないのですか? – jrok

答えて

1

あなたが変数のtypeidを知っている場合には、これは可能です。これは、あなたがいつもC++でtypeid演算子を使って知ることができます。

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 *" 

その後、convertible type ids(変換可能タイプ)の場合などmultimapまたは(あなたがに変換可能であるかどうかを知りたい)typeidとして、キーと値を持つを作成する必要があります。この場合、この場合は、のkeyにはconst type_info& toにマップされたvalueがあるかどうかを検索するためにマップにアクセスできます。はいの場合は、trueまたはfalseとboolを戻すことができます。しかし、この場合、コード内にすべてのクラスと継承が正しく表示されていることを確認する必要があります。そしてそれに基づいて、それが法的な変換になるかどうかを決定し、その基準で地図を追加します。しかし、これは面倒なプロセスであり、私はそれを使用することはできません。

一般的に、タイプが他のタイプにキャストされているか正しくない場合は、dynamic castを通して知ることができます。 static_castは互換性のない型を相互にキャストしますが、間違った使用は実行時エラーにつながります。

4

ポータブルC++では必要なことを行うことはできません。

あなたが特定のプラットフォームに自分自身を制限場合、部分的な答えを実現することが可能です。例えばItanium ABIに付着これらのプラットフォームは、この機能の実装があります:このABIで

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_infostd::type_infoから誘導型であり、プログラムに全てstd::type_info Sはダイナミック型を導出していますstd::type_infoabi::__class_type_infoは単なる一例にすぎない)からである。

このABIを使用すると、std::type_infoを指定すると、任意のタイプ(実行時)の継承階層をナビゲートするツールを構築できます。そして、そうすることで、2つのタイプがdynamic_cast、さらにはstatic_castの2つのタイプを表すかどうかを判断することができます。

このようなソリューションでは、変換コンストラクタまたは変換演算子を使用するタイプ間の変換は考慮されません。その制限が受け入れられる場合でも、私はこのルートを推奨しません。これは簡単なプロジェクトではなく、エラーが起こりやすいでしょう。しかしこれはおそらくあなたのC++の実装がdynamic_castを実装しているので、明らかに不可能ではありません。

関連する問題