c++ 如何用std::string或其等价物 Package 一个普通的char缓冲区?

qmb5sa22  于 2024-01-09  发布在  其他
关注(0)|答案(4)|浏览(103)

动机:

我正在使用一些库(我无法控制),函数如下:

char* foo(/*some parameters here */);

字符串
它返回一个很长的以null结尾的字符串。

void bar(const std::string& s);


这在我正在使用的另一个库中可用(也就是说,我不控制这两个函数的签名)。我想将foo()的结果传递给bar()-而不复制它。

问题:

我想用一个字符串对象 Package 一个连续的字符缓冲区,这样它就可以作为const std::string&传递。我怎么做?

备注:

  • 我知道这可能会让人不快,但如果可能的话,我还是想做。
  • 是的,这可能是不合适的,或者丑陋的,或者太像C-但这是我(认为我)需要做的。
  • 对答案的评论表明,继承std::string不是一个选择,因为它没有适当的虚方法。这基本上让我们假设有关实现的事情(或为不同的实现编写不同的代码),并“手工构造”std::string示例。因此,问题似乎是关于这样做的。
tquggr8v

tquggr8v1#

不,你不能。检查你的要求,消除这种需要。

4urapxun

4urapxun2#

您可以使用boost::string_ref来模拟它。

它有一个与std::string可互操作的接口:

boost::string_ref s = "hello world";

std::string compareto = "bye world";

bool test = (compareto != s);

字符串
当然,只有当你可以选择在接口中接受string_ref而不是string时,这才能起作用。这样,你可以在空闲时传递c-strings或std::strings,它会做正确的事情。

pod7payv

pod7payv3#

老问题了,但从C++17开始,你现在有了std::string_view,这正是完成这项工作的正确工具。
简单地将其初始化为:

auto my_string_view = std::string_view(foo(whatever));

字符串
..

auto my_new_string = std::string{my_string_view}

kh212irz

kh212irz4#

你不能这样做,但是你可以很容易地写你自己的string类。因为你明确地禁止复制它,你甚至不需要支持很多std::string类型的操作,比如连接等。
(In理论上,您可以通过创建一个内部缓冲区树来支持连接而不复制,但这将是更多的工作。)

相关问题