【发布时间】:2015-02-19 10:14:47
【问题描述】:
我有一个模板函数,它接受一个整数类型的参数并将其复制到堆栈上的字符数组中,std::snprintf:
static const size_t size = 256;
char buffer[size];
template <class T, std::enable_if<std::is_integral<T>::value, T>::type>
bool to_array(T integer) {
auto ret = std::snprint(buffer, size, "%lld", integer);
return ret > 0;
}
问题在于,如果此函数与 int 类型一起使用,编译器会打印警告,即 "%lld" 掩码需要 long long int 类型。
为了修复它,我使用了boost::fusion::map:
using bf = boost::fusion;
using integral_masks = bf::map<
bf::pair<char, const char*>,
bf::pair<short, const char*>,
....
bf::pair<unsigned long long, const char*>
>;
integral_masks masks(
bf::make_pair<char>("%c"),
bf::make_pair<int>("%d"),
....
bf::make_pair<unsigned long>("%lu")
bf::make_pair<unsigned long long>("%llu")
);
auto ret = std::snprint(buffer, size, bf::at_key<T>(masks), integer);
这可行,但它看起来有点重,并且boost::fusion 标头显着增加了编译时间。也许有更好更简单的方法来做到这一点?
【问题讨论】:
-
为什么不直接使用
std::to_string? -
@SanderDeDycker 嗯,这是一个简化的例子,我试图避免在这里分配内存。