Итак, у меня есть хороший постоянный класс распределителя persistent_alloc<T>
, который позволяет мне выделять объекты и строки контейнера С++ в постоянную память, которая поддерживается файлом 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;
}
... и теперь я могу сравнить строки для равенства. Но добавление их для каждой операции кажется болью - кажется, что они ДОЛЖНЫ быть предоставлены стандартной библиотекой. Хуже того, операторы присваивания и конструкторы копирования должны быть членами и не могут быть определены как глобальные встроенные функции, подобные этому.
Есть ли разумный способ сделать это? Или мне нужно эффективно переписать всю стандартную библиотеку для удобства использования распределителей?