我需要将一些数字(整数和 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/

10-09 23:11