支持std :: ostream运算符中的const_string<<

时间:2011-04-20 13:30:42

标签: c++ templates string boost ostream

我目前正在使用非常聪明的软件包boost::const_string,直到http://libcxx.llvm.org/预先打包在Ubuntu或GCC上,使其__versa_string(在标头ext/vstring.h中)成为默认软件包字符串实现。 libcxx的std::string以及__versa_string默认使用_small-string optimization(SSO)。但是,缺少输出到std::ostream的默认支持。代码

#include <iostream>
#include <boost/const_string.hpp>

const_string<char> x;
std::cout << x << endl;

不起作用,除非我们通过xc_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()已知,无需像NULL中那样搜索c_str()来计算。我为我工作,但我不确定它是否适用于所有情况。我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

  

我错过了什么吗?

是的,只需加入const_string/io.hpp即可。但它只是:

return o << std::basic_string<char_type, traits_type>(s.data(), s.size());

答案 1 :(得分:2)

根据应用于字符串流的区域设置和/或方面,这可能会产生影响,而不仅仅是在编写直接数据时。

性能较差,但是如何从const_string创建一个std :: string并使用<<将其插入流中呢?

答案 2 :(得分:1)

不(你没有错过任何东西,afaik)。如果你的目标不是复制内容,str.data()就是你的选择。