我需要将一些数字(整数和 double )转换为std::strings,并且出于性能原因,不能使用stringstream(并发使用时,它会非常慢)
能够做类似的事情会很好
template<typename T>
static const std::string numberToString(T number)
{
char res[25];
// next line is a bit pseduo-y
snprintf(res, sizeof(res), "%T", number);
return string(res);
}
但是我不确定如何做到这一点的最佳方法?
最佳答案
这是一个主意。使用:
template<typename T>
static const std::string numberToString(T number)
{
char res[25];
snprintf(res, sizeof(res), getPrintfFormat<T>(), number);
return res;
}
示例程序:
#include <iostream>
#include <cstdio>
#include <string>
template <typename T> struct PrintfFormat;
template <> struct PrintfFormat<int>
{
static char const* get() { return "%d"; }
};
template <> struct PrintfFormat<float>
{
static char const* get() { return "%f"; }
};
template <> struct PrintfFormat<double>
{
static char const* get() { return "%f"; }
};
template <typename T>
char const* getPrintfFormat()
{
return PrintfFormat<T>::get();
}
template<typename T>
static const std::string numberToString(T number)
{
char res[25];
snprintf(res, sizeof(res), getPrintfFormat<T>(), number);
return res;
}
int main()
{
std::cout << numberToString(10) << std::endl;
std::cout << numberToString(10.2f) << std::endl;
std::cout << numberToString(23.456) << std::endl;
}
输出:
10
10.200000
23.456000
它还提供了某种类型的安全性。使用已发布的代码,使用
std::cout << numberToString('A') << std::endl;
将导致编译时错误。
关于c++ - 模板化的snprintf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42514176/