我目前使用的非常巧妙包装boost::const_string
const_string直到http://libcxx.llvm.org/提供预打包在Ubuntu或GCC使其__versa_string
(在头ext/vstring.h
)的默认字符串实现。 libcxx的std::string
以及__versa_string
默认使用_small-string优化(SSO)。但缺乏输出到std::ostream
的默认支持。该代码支持中的std :: ostream的运营商<<
#include <iostream>
#include <boost/const_string.hpp>
const_string<char> x;
std::cout << x << endl;
不起作用,除非我们迫使x
成通过c_str()
一个C字符串变成
std::cout << x.c_str() << endl;
来编译和按预期工作。添加以下行来const_string.hpp
template <typename T>
inline std::ostream & operator << (std::ostream & os, const boost::const_string<T> & a)
{
return os.write(a.data(), a.size());
}
这应该提高性能超过x.c_str()
因为size()
是已知的,不需要通过如在c_str()
搜索NULL
计算。我为我工作,但我不确定它是否适用于所有情况。我错过了什么吗?
这取决于你想为非打印字符(尤其是'\ 0')想要的行为,我猜。我认为(!)普通字符串的默认行为是在空字符后截断。你的实现可能不会那样做。顺便说一句,+1使我意识到'boost :: const_string'。 – 2011-04-20 13:51:35
我认为这是一种权衡。 据我所见,你的代码并不反映像 'std :: setw'这样的操纵器设置。 如果你不把'const_string'这些操纵器, 我认为你的代码有它自己的用处。 – 2011-04-20 15:05:03