使用Boost Karma替换STD :: stringstream double到STD :: String Conv
Using Boost Karma to replace std::stringstream for double to std::string Conversion
用于改进性能,我希望替换:
template<class T> std::string ToStringFixed(const T x, const unsigned int width = 8)
{
std::stringstream ss;
ss << std::setprecision(width) << std::fixed << x;
return ss.str();
}
随着Boost业力的实施,我们的项目已经使用了Boost,并且看起来比上面的幼稚解决方案具有显着的性能增长。
类似:
std::string ToString(double d)
{
using boost::spirit::karma::double_;
using boost::spirit::ascii::space;
using boost::spirit::karma::generate;
std::string s
std::back_insert_iterator<std::string> sink(s);
generate(sink, double_, d);
return s;
}
从以下方式采用:http://thisthread.blogspot.com/2011/04/generating-text-with-with-spirit-karma.html似乎在正确的轨道上,但对我来说还不清楚为了控制精度,或者如果可以在不使用类型特征的情况下,对于浮点类型而言,这种解决方案是否可以模板友好。(通过C 14使用的答案是可以接受的。)
您可以借助real_generator
的格式策略来实现所需的目标。由于您只需要修改精度,因此您可以从默认的real_policies<Num>
派生,然后添加具有您需要行为的precision(Num n)
成员函数。
在wandbox上运行
#include <iostream>
#include <string>
#include <cmath>
#include <boost/spirit/include/karma.hpp>
template <typename Num>
struct precision_policy : boost::spirit::karma::real_policies<Num>
{
precision_policy(int prec):precision_(prec){}
int precision(Num n) const { return precision_; }
int precision_;
};
std::string ToStringFixedKarma(double d, const unsigned int width = 8)
{
using boost::spirit::karma::real_generator;
using boost::spirit::ascii::space;
using boost::spirit::karma::generate;
real_generator<double,precision_policy<double> > my_double_(width);
std::string s;
std::back_insert_iterator<std::string> sink(s);
generate(sink, my_double_, d);
return s;
}
int main() {
const double pi = std::acos(-1);
std::cout << ToStringFixedKarma(pi) << std::endl;
std::cout << ToStringFixedKarma(pi,2) << std::endl;
std::cout << ToStringFixedKarma(pi,4) << std::endl;
}
ps:文档(并检查源)似乎暗示成员在这些政策中的功能需要静态,这将使您不可能需要的东西,但是如本示例所示,情况并非如此。p>
相关文章:
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 重载 + 自己的类和 std::string 的运算符
- 如何使用 std::string 作为 QHash 的键?
- 将日语 wstring 转换为 std::string
- 可以从std::string继承以提供类型一致性吗
- 构造函数采用std::string_view与std::string并移动
- 在共享缓冲区内存中创建 ::std::string 对象
- std::string.size() 未知行为
- Valgrind 在 std::string::swap 中报告 SIGILL