У нас есть класс 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);
}
Я попытался использовать, как показано ниже, и получил ошибку, по которой я понял, что мы не можем использовать std::fixed
в моем классе StreamBuffer
.
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();
}
Есть ли какой-либо другой оптимизированный и эффективный способ?