【发布时间】:2016-05-17 10:30:44
【问题描述】:
我们有一个 StreamBuffer 类,我们没有在其中实现 std::fixed 操作,我试图防止数字出现在科学计数法中。使用我下面的代码,一些数字以科学计数法显示。我们希望避免进行任何分配,因此出于性能原因,我们实现了StreamBuffer 类。
下面是代码:
T value = 0;
template<typename U> void process(U& buf, DataOption holder) const {
if (holder == DataOption::TYPES) {
switch (type_) {
case teck::PROC_FLOAT:
buf << "{\"float\":" << value << "}";
break;
case teck::PROC_DOUBLE:
buf << "{\"double\":" << value << "}";
break;
default:
buf << "{\"" << type_ << "\":" << value << "}";
}
}
}
这就是它的调用方式:
void HolderProcess::dump(std::ostream& os, DataOption holder) const
{
process<std::ostream>(os, holder);
}
void HolderProcess::dump(StreamBuffer& buffer, DataOption holder) const
{
process<StreamBuffer>(buffer, holder);
}
我尝试使用如下所示的方式,但出现错误,据我了解我们无法在 StreamBuffer 类上使用 std::fixed。
case teck::PROC_DOUBLE:
buf << "{\"double\":" << std::fixed << value << "}";
std::fixed 的替代品是什么,我可以在这里使用它根本不做任何分配。我正在考虑将数字转换为字符串,然后在其上应用std::fixed,但这也会进行一些分配,我想避免这种情况。
执行此操作的最佳方法是什么,既能提高性能又不进行任何分配?我有一个下面的解决方案,但它会在使用字符串时进行一些分配。我可以从上面的代码中调用下面的方法。
template <typename T> string str(T number)
{
std::ostringstream ss;
ss << std::fixed << number;
return ss.str();
}
还有其他优化高效的方法吗?
【问题讨论】:
-
你遇到了什么错误?
-
StreamBuffer是否继承自std::streambuf?因为fixed是在格式化的I/O 级别实现的,远高于streambuf。 -
它不是从
streambuf继承的,我也无法更改该类来做到这一点,因为它已经被使用了很长时间,它会破坏其他使用它的地方,所以试图看看一些替代和有效的方法 -
你还没有真正明确你想要什么。什么数字以指数形式出现?如果你输入 1.23e+20,你真的想要一个固定的数字吗?
-
是的,这就是我的意思.. 很抱歉造成混乱.. 有些数字是指数形式的,我想为这些数字设置一个固定的数字。在上述每个案例块中,价值都以指数形式出现,我希望它得到修复。