私はすべての種類のリソースを管理するジェネリッククラスを持っていますが、すべてのTに対してResourceManagerのインスタンスを作成したくないので(つまり、それぞれのタイプTに対して1つのリソースマネージャを持っています)、 ResourceManagerクラスにTの型を知らせないようにします。void *をより高いものにキャストする安全な方法はありますか?
void *ポインタのマップを保存し、誰かがテンプレート化されたLoad()メソッドから特定の型を要求した場合に、それらを必要な形式に変換し直します。
template<>
AwesomeType* Load(const std::string &location)
{
//etc.
return static_cast<AwesomeType*>(m_resources[location]);
}
が、私はこれは醜いであることを承知していますが、今はその周りに方法はありません。
template <typename T>
T* Load(const std::string &location)
{
//do some stuff here
//everybody take cover!!!
return static_cast<T*>(m_resources[location]);
}
は、私はクラスに異なるローダーを導入するテンプレート特殊化を使用しています。私は、特殊なLoadメソッドの内部に静的なマップを導入することができますが、その方法では、ResourceManagerオブジェクトの存続期間にリソースの存続期間をバインドすることができません。これは不可欠な機能です。
しかし、これは幾分危険です(これらのvoid *ポインタは何でもかまいません)ので、少なくとも実行時に変換がうまくいくかどうかチェックしたいので、アプリケーションのクラッシュを起こすことなく対応できます。
どうすればいいですか?
'dynamic_cast'を使って' NULL'をチェックしますか? –
'dynamic_cast'は、既知の型を可能な限り別の型に変換します。 'void *'は既知の型ではなく、型なしです。コンパイラはあなたにそれをさせません。 – Damon