模板化的snprintf

时间:2017-02-28 16:38:27

标签: c++ templates printf

我需要将一些数字(整数和双精度)转换为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}]

但我不确定实现这个目标的最佳方法是什么?

1 个答案:

答案 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;

将导致编译时错误。