8

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

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

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

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

4

2 に答える 2

6

移植可能な C++ では、必要なことを行うことはできません。

特定のプラットフォームに限定すると、部分的な回答が得られる可能があります。たとえば、Itanium 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 では、abi::__class_type_infoは から派生した型でstd::type_infoあり、プログラム内のすべて の は(は 1 つの例にすぎません)std::type_infoから派生した動的な型を持ちます。std::type_infoabi::__class_type_info

この ABI を使用すると、std::type_info. そうすることで、2 つstd::type_infoの が 2 つの型を表しているかどうかを判断できdynamic_castますstatic_cast

このようなソリューションでは、変換コンストラクターまたは変換演算子を使用した型間の変換が考慮されないことに注意してください。その制限が許容できるとしても、このルートはお勧めしません。これは簡単なプロジェクトではなく、非常にエラーが発生しやすいものです。しかし、これはおそらくあなたの C++ 実装が を実装する方法dynamic_castであるため、明らかに不可能ではありません。

于 2012-05-08T23:50:53.650 に答える
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 *"

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

一般に、c++ を使用するとdynamic cast、型を他の型にキャストできるかどうか、または適切にキャストできないかどうかを知ることができます。互換性のない型をstatic_cast互いにキャストすることさえありますが、不適切な使用は実行時エラーにつながります

于 2012-05-08T16:58:43.693 に答える