type_info
新しい標準の作成中のどこかで、より簡単に使用できるという約束がありました。その結果、 hash_code
. C++11 でリフレクション システムを実装しましたが、一意の型識別で再び問題が発生しました。
私は欲しい:
- 一意の識別子である typeid を使用して型から抽出できるようにするもの
- 一意の識別子は、キー/値コンテナーで使用できる必要があります
- 識別子は移植可能である必要はなく、プログラムの実行間で同じである必要さえありません
プログラム実行間の持続性は必要ないことに注意してください。それが思われるよう:
.name()
標準ではまったく保証されていないため、まったく役に立ちません。.hash_code()
一意であることが保証されていないため、これも役に立ちません- オブジェクトへのポインターを取得しても、
type_info
どこでも機能するとは限りません (たとえば、DLL 間)。 - #3 と同じ問題に悩まされないかどうかはわかり
.before()
ませんが、有用であるように思われます
を使用する場合でも、.before()
を使用できますmap
が、私は を使用したいと思いますunordered_map
。
struct compare_type_info {
bool operator ()(const type_info* a, const type_info* b) const {
return a->before(*b);
}
};
std::map<const type_info*, X, compare_type_info> map;
m[&typeid(int)] = something;
上記は衝突に対して安全ですか?順序演算子は !< および !> 値の上書きを保証しますか?
ハッシュ衝突のリスクなしでこの問題を解決する方法はありますか?
私自身の型システムをロールアップするという点では、私はすでにそれを行っていますがtypeid
、基本型から適切な最終型を与える (継承) という問題を解決し、クラスにフィールドを追加したくありません (型システムは「外部」)。
C++11 でさえ、私たちはまだ失敗しているのでしょうか? :/