gpt4 book ai didi

c++ - 模板化 snprintf

转载 作者:行者123 更新时间:2023-11-30 05:16:44 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com