そのため、C++ コンテナ オブジェクトと文字列を永続メモリに割り当てることができる、優れた永続アロケータ クラスpersistent_alloc<T>
があります。このメモリは、プログラムの 1 回の実行から次の実行まで保持できる mmaped ファイルに支えられています。
私の問題は、永続オブジェクトと非永続オブジェクトを混在させたい場合に発生します。たとえば、私は
typedef std::basic_string<char, std::char_traits<char>, persistent_alloc<char>> pstring;
pstring a, b, c;
std::string x, y, z;
次のようなことができるようになりたいです。
if (a == x)
a = y;
c = z + b;
pstring
などですが、とstd::string
は無関係なタイプであるため、デフォルトでは機能しません。比較に関する限り、次のように定義できます。
template<typename Alloc1, typename Alloc2> inline bool
operator==(const std::basic_string<char, std::char_traits<char>, Alloc1> &a,
const std::basic_string<char, std::char_traits<char>, Alloc2> &b)
{
return strcmp(a.c_str(), b.c_str()) == 0;
}
...これで、文字列が等しいかどうかを比較できます。しかし、すべての操作にこれらを追加するのは面倒に思えます-標準ライブラリによって提供される必要があるようです。さらに悪いことに、代入演算子とコピー コンストラクターはメンバーでなければならず、このようなグローバル インライン関数として定義することはできません。
これを行う合理的な方法はありますか?それとも、アロケータを便利にサポートするために、標準ライブラリ全体を効果的に書き直す必要がありますか?