gpt4 book ai didi

c++ - boost::interprocess::basic_string 作为 std::string

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:49 24 4
gpt4 key购买 nike

我正在尝试用 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; }
}

问题是我们有一个庞大的代码库依赖于此:

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<> ,它对您的目的完全没用 - 转换后,进程间字符串将被销毁,它的分配器是重要的分配器(即,将数据保存在共享内存中的分配器,我assume 是你切换 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();

这样,只有typedef A 内部需要更改,所有依赖它的代码将自动使用正确的类型。

关于c++ - boost::interprocess::basic_string 作为 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7447976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com