C++ boost::进程间::基本字符串作为std::字符串

C++ boost::进程间::基本字符串作为std::字符串,c++,boost,stdstring,boost-interprocess,C++,Boost,Stdstring,Boost Interprocess,我试图用const boost::interprocess::basic_string&替换返回const std::string&的类方法。我面临的主要挑战是两个类之间的不兼容性,尽管它们的实现相似。为了得到更清楚的解释,我将把它写进代码中 class A { std::string m_str; const std::string & StrVal() { return m_str; } } 现在这个类必须如下所示: typedef boost::interprocess::al

我试图用const boost::interprocess::basic_string&替换返回const std::string&的类方法。我面临的主要挑战是两个类之间的不兼容性,尽管它们的实现相似。为了得到更清楚的解释,我将把它写进代码中

class A
{ std::string m_str;
 const std::string & StrVal() { return m_str; }
}
现在这个类必须如下所示:

typedef boost::interprocess::allocator<char,boost::interprocess::managed_shared_memory::segment_manager> ShmemAllocatorChar;
typedef boost::interprocess::basic_string<char, std::char_traits<char>,ShmemAllocatorChar> ShMemString;

class A
{
 ShMemString m_str;
 const ShMemString & StrVal() { return m_str; }
}
即使我用const ShMemString&替换所有预期结果的代码,也要修复后面的用法,这将是一项更加困难的工作。我惊讶地发现boost的字符串没有包含来自std::string的任何比较/构造方法


关于如何实现这一点有什么想法吗?

即使
boost::interprocess::basic_string
确实转换为
std::basic_string
,它对您的目的完全没有用——转换后,进程间字符串将被销毁,其分配器是重要的(即,在共享内存中保存数据的那一个,我认为这是您首先切换
basic_string
实现的动机)

因此,最后,您别无选择,只能检查所有代码,用
ShMemString const&
(或者
auto const&
替换预期结果,如果您的编译器足够新,可以支持它)


为了在将来减轻这种痛苦,
typedef
明智地:

struct A
{
    typedef ShMemString StrValType;
    StrValType const& StrVal() { return m_str; }
private:
    StrValType m_str;
};

// ...

A a;
A::StrValType const& str = a.StrVal();
这样,只有
A
内部的
typedef
需要更改,所有依赖它的代码将自动使用正确的类型

问题在于,我们有一个庞大的代码库,这取决于:

A a;
const std::string & str = a.StrVal();
// Many string specific operations go here, comparing str with other std::strings for instance
为什么第二个函数中的
A::StrVal
返回一个
interprocess::basic_string
?它是在内部使用
interprocess::basic_string
的类
A
的一个实现细节。它的接口使用的实际字符串类不一定是相同的。这只是重构很差

A::StrVal
应该像往常一样返回
std::string
(当然不是
const&
,但是用户代码不需要因此而更改)因此,
A::StrVal
将需要在两种字符串类型之间进行转换。这就是正确重构的方式:更改实现,但接口保持不变


是的,这意味着您必须复制字符串数据。继续使用它。

那么,这如何解决
interprocess::string
中缺少比较函数的问题呢?@Nicol:为什么
boost::interprocess::string
应该内置函数与
std::string
进行比较?这有什么作用而不是将前者与后者紧密耦合?也就是说,一个人可以简单地使用任何基于迭代器的算法并避免耦合。
interpolcess::basic_string
不应该有与
std::string
的比较函数,这可能是正确的。但说这并不能解决他的问题。他仍然需要这些比较函数来完成他需要做的事情。你的建议基本上是放弃他代码库中任何地方的
std::string
,即使是在不处理进程间通信的地方。这是一个非常重要的改变,没有真正的必要。@Nicol:不,我主张使用基于迭代器的比较算法
boost::interprocess::string
/
std::string
成员函数的ad。我不认为该类打算返回存储在共享内存中的数据是一个实现细节…@ildjarn:如果该类的最后一个版本返回了
std::string
。如果接口需要更改,那么它应该仍然支持旧的
std::string
接口同时也支持新的接口。在重构某些东西时,您从不修改现有接口。您可以添加新接口,但仍然需要支持旧接口。我不知道该说些什么,除此之外,我几乎完全不同意。@Nicol不幸地保留了接口并返回std::string&将涉及保留一个额外的成员并同步其值,仅用于此方法。@Yordan:谁说您需要返回一个
std::string&
?只需按值返回它。您现在返回一个
const std::string&
,所以即使他们通过
const std::string&
捕获它,我也会t仍然有效。const&将延长临时文件的使用寿命。