11

myClass用途によっては、追加の状態情報を格納する必要がある汎用クラスがあります。これは通常、で行われますが、クラスインスタンスが破棄されたときにメモリが自動的に解放されるように、をvoid*使用できるかどうか疑問に思いました。std::unique_ptr<void, void(*)(void*)>問題は、void *を削除すると未定義の動作が発生するため、カスタム削除機能を使用する必要があることです。

デフォルトでを構築する方法はありますか?std::unique_ptr<void, void(*)(void*)>最初にダミーの削除機能を使用して構築し、次にvoid*状態構造体にを使用するときに実際の削除機能を設定する必要はありませんか?または、クラスに状態情報を格納するためのより良い方法はありますか?

サンプルコードは次のとおりです。

void dummy_deleter(void*) { }

class myClass
{
public:
    myClass() : m_extraData(nullptr, &dummy_deleter) { }
    // Other functions and members
private:
    std::unique_ptr<void, void(*)(void*)> m_extraData;
};
4

1 に答える 1

6

おそらく、追加情報を格納するためのより直感的な方法は、仮想デストラクタを備えたインターフェイスIAdditionalDataを使用することです。IAdditionalDataから継承し、に格納される可能性のあるデータ構造は何でもstd::unique_ptr<IAdditionalData>

これにより、データ型との間でreinterpret_castを実行する代わりに、IAdditionalDataと実際の型の間で静的キャストを行うため、型の安全性が少し向上しますvoid *

于 2013-03-13T12:04:25.783 に答える