所以我有一个很好的持久分配器类persistent_alloc<T>
,它允许我在持久内存中分配 C++ 容器对象和字符串,该内存由一个 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;
}
...现在我可以比较字符串是否相等。但是为每个操作添加这些似乎很痛苦——似乎它们应该由标准库提供。更糟糕的是,赋值运算符和复制构造函数必须是成员,不能像这样定义为全局内联函数。
有没有合理的方法来做到这一点?还是我必须有效地重写整个标准库以有效地支持分配器?