![](/img/trans.png)
[英]boost::interprocess::map - how to update value with basic_string as type
[英]boost::interprocess::basic_string as std::string
我试图替换一个返回const std :: string&与const boost :: interprocess :: basic_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; }
}
问题是我们有一个庞大的代码库,具体取决于:
A a;
const std::string & str = a.StrVal();
// Many string specific operations go here, comparing str with other std::strings for instance
即使我使用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::StrVal
返回一个interprocess::basic_string
? 它是A
类的一个实现细节,它在内部使用interprocess::basic_string
。 它的接口使用的实际字符串类不必相同。 这简直就是糟糕的重构。
A::StrVal
应该像往常一样返回一个std::string
(当然,不是const&
,但用户代码不需要因此而改变)。 因此, A::StrVal
需要在两种字符串类型之间进行转换。 这就是如何进行适当的重构:您更改了实现,但界面保持不变。
是的,这意味着您将不得不复制字符串数据。 和它一起生活。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.