动机:
我正在使用一些库(我无法控制),函数如下:
char* foo(/*some parameters here */);
字符串
它返回一个很长的以null结尾的字符串。
void bar(const std::string& s);
型
这在我正在使用的另一个库中可用(也就是说,我不控制这两个函数的签名)。我想将foo()
的结果传递给bar()
-而不复制它。
问题:
我想用一个字符串对象 Package 一个连续的字符缓冲区,这样它就可以作为const std::string&
传递。我怎么做?
备注:
- 我知道这可能会让人不快,但如果可能的话,我还是想做。
- 是的,这可能是不合适的,或者丑陋的,或者太像C-但这是我(认为我)需要做的。
- 对答案的评论表明,继承
std::string
不是一个选择,因为它没有适当的虚方法。这基本上让我们假设有关实现的事情(或为不同的实现编写不同的代码),并“手工构造”std::string
示例。因此,问题似乎是关于这样做的。
4条答案
按热度按时间tquggr8v1#
不,你不能。检查你的要求,消除这种需要。
4urapxun2#
您可以使用
boost::string_ref
来模拟它。它有一个与std::string可互操作的接口:
字符串
当然,只有当你可以选择在接口中接受
string_ref
而不是string
时,这才能起作用。这样,你可以在空闲时传递c-strings或std::strings,它会做正确的事情。pod7payv3#
老问题了,但从C++17开始,你现在有了std::string_view,这正是完成这项工作的正确工具。
简单地将其初始化为:
字符串
..
型
kh212irz4#
你不能这样做,但是你可以很容易地写你自己的string类。因为你明确地禁止复制它,你甚至不需要支持很多std::string类型的操作,比如连接等。
(In理论上,您可以通过创建一个内部缓冲区树来支持连接而不复制,但这将是更多的工作。)