如何将std::string替换为vstring?

7

我最近学到,自从几年前以来,库libstdc++包含了vstring(也称为versa_string),它提供了与std::string相同的功能,但显然更符合C++标准。我尝试使用vstring替换std::string,但我没有找到简单的方法来做到这一点。

有没有一种简单的方法可以替换std::string为vstring,而不必更改libstdc++源代码?

我可以通过将以下清单中的所有使用std::string的地方替换为别名来解决问题。然而,这种方法的问题在于,std::string还在某些地方内部使用,例如在std::ostringstream中。这意味着语句std::ostringstream os; my::string s = os.str();将不再起作用。

namespace my {
#ifdef __GLIBCXX__
    using string = __gnu_cxx::__vstring;
#else
    using string = std::string;
#endif
}

最近版本?vstring在4.1中被添加。请参阅https://dev59.com/JGkv5IYBdhLWcg3wpCMz。 - Chnossos
我记得在某个视频中Herb Sutter说过gcc4.9将使std::string非引用计数,但我在发布说明中没有看到这一点。您可以通过使用my::string s = os.str().c_str();来修复您列出的一个案例中的错误。甚至可能有一种方法可以访问底层streambuf以避免中间的std::string,但我不确定这部分。 - Praetorian
3
@Praetorian: JW表示它不会满足4.9 https://dev59.com/Z3vaa4cB1Zd3GeqPI-FA#0esLoYgBc1ULPQZFzjlx - Lightness Races in Orbit
事实上,关于COW字符串的死亡的传言被夸大了;-)回答这个问题,没有办法在库中替换std::string。你必须等待GCC 4.10。 - Jonathan Wakely
1
@JonathanWakely:我认为你可以把这个变成一个答案。 - Matthieu M.
1个回答

5
没有办法用 vstring 替换 std::string,它是作为另一种字符串类型而存在的,而不是 std::string 的即插即用替代品。

从 GCC 5.1 开始,该库提供了两个 std::string 实现,对于任何给定的翻译单元,您可以通过 _GLIBCXX_USE_CXX11_ABI 宏选择使用哪个实现。这两种字符串类型具有不同的名称,因此不能链接兼容。

有关更多详细信息,请参见 Dual ABI


您介意更新此答案吗?自2014年以来,GCC已经取得了很大进展。 - einpoklum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接