リソースのリストを std::vector に保存したい場合があります。私が見ているように、私のオプションは次のとおりです。
- リソースにデフォルトのコンストラクターを与える
- それらをヒープオブジェクトとして保存します(共有ポインターでラップします)
オプション 1 は無効なリソースを構築することを可能にし、オプション 2 はヒープの使用を強制します。
ここにオプションがありませんか?
インスタンスのベクトルを持つデフォルトのコンストラクターは必要ありません。
唯一の制限は、クラスにデフォルトのコンストラクターがない場合、デフォルトの引数で vector::resize を使用できないことです。
vec.resize(20); // requires default constructor
しかし、 vector::resize にデフォルトのオブジェクトを与えることができます:
std::vector<foo> vec;
vec.resize(20, foo(10)); // give a sample object since foo has not default constructor
自明でないコンストラクターを持つオブジェクトをベクトルに格納できます。stl コンテナー内のオブジェクト ストアには、代入セマンティック (コピー コンストラクターと代入演算子) が必要です。
3 番目のオプションは、Boost.PointerContainerを使用することです。ただし、オブジェクトは引き続き個別にヒープに割り当てられます。Johann がコメントしたように、std::vector は既にヒープを使用してオブジェクトを (連続して) 格納しているため、ヒープを完全に回避する方法はありません。
多くの場合、リソース (ミューテックス、I/O ストリームなど) にコピー セマンティクスを許可しても意味がありません。そのため、コピー コンストラクターと代入演算子を非公開にすることで、コピー不可にする必要があります。残念ながら、コピー不可の制限により、リソースを STL コンテナー内に値として直接格納することはできません。したがって、Boost.PointerContainer またはスマート ポインターのコンテナーのいずれかに頼る必要があります。Boost.PointerContainer ドキュメントのMotivationセクションでは、どちらを使用するのが好ましいかについて説明しています。