which cast (static_cast? dynamic_cast? other...) *value が T オブジェクトに適切に変換されるように使用する必要があります
この変換を行う必要がある場合はstatic_cast
、 を使用する必要があります。これは、一般に (とりわけ) 標準変換を逆にするように設計されています。任意のオブジェクト ポインター型から への標準的な変換がありvoid*
、ゲッターはそれを逆にするため、そのために設計されたキャストを使用します。
return *static_cast<T*>(value);
また、コンストラクターから C スタイルのキャストを削除するか、それを a に置き換える必要もありstatic_cast
ます。
Areinterpret_cast
も機能しますが、「やり過ぎ」です。一般に、必要な変換を実行しながら、できるだけ制限的なキャストを使用する必要があります。
値が元々この型でなかった場合、例外がスローされます
あなたは運が悪いです.C++は、ポインタをにキャストすると、オブジェクトの元の型が何であったかを一般的に知ることができませんvoid*
。getValue
あなたのコードは、呼び出し元が正しい型で呼び出すことに依存しています。たとえば、元の型がchar
C++ では 1 バイトであり、コンパイラがgetValue
.
dynamic_cast
はいくつかの限られた状況で型をチェックしますが、テンプレートは完全にジェネリックであるため、それらの限られた状況には当てはまらない場合があります。
これが気に入らない場合は、クラスを変更して、オブジェクト ポインターに加えて、オブジェクトへのポインター(演算子type_info
の使用の結果) を格納することができます。typeid
標準ヘッダーを参照してください<typeinfo>
。次に、コンストラクターtype_info
の型のオブジェクトを の型のオブジェクトと比較し、一致しない場合はスローします。T
type_info
T
getValue
あなたが言うように、あなたのクラスは少し似ていることを意図しており、boost::any
似getValue
ていany_cast
ます。そのクラスのソースとドキュメントを参照して、必要なことを行うために必要なトリックを確認できます。それを行う簡単な方法があればboost::any
、簡単なクラスになります!