我需要将一些数字(整数和双精度)转换为std :: strings,并且由于性能原因不能使用stringstream(我们发现它在并发使用时非常慢)
能够做类似
的事情会很高兴[Error Domain=com.worldpay.error Code=1 "Card Expiry is not valid" UserInfo={NSLocalizedDescription=Card Expiry is not valid}, Error Domain=com.worldpay.error Code=2 "Card Number is not valid" UserInfo={NSLocalizedDescription=Card Number is not valid}]
但我不确定实现这个目标的最佳方法是什么?
答案 0 :(得分:1)
这是一个想法。使用:
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;
将导致编译时错误。