简单地忽略一个事实,即正常的函数重载将更好地服务于这个示例。它只是作为学习模板编程的一种方式。话虽如此,欢迎您评论与函数模板专业化相比,使用函数重载所获得的好处/差异(尽管这可能值得一个自己的问题)。
考虑以下示例:
template <typename T>
inline void ToString(T value, char* target, size_t max_size );
template <>
inline void ToString<float>(float value, char* target, size_t max_size)
{
snprintf( target , max_size , "%f" , value);
}
template <>
inline void ToString<double>(double value, char* target, size_t max_size)
{
snprintf( target , max_size , "%f" , value);
}
有没有一种方法可以只编写与两者都匹配的这些专业化之一float
and double
types?
基本上,我设想为模板类型编写一个模板专门化,以匹配两者float
and double
(作为“float 或 double”类型匹配器)但我不确定这对于 C++ 是否可行。也就是说,我以前见过意想不到的模板魔法在我眼前发生,所以我认为这是一个很好的问题。
这是一个标准的解决方案习惯用法:
#include <type_traits>
#include <cstdio>
// Helper class
template <typename T>
struct Printer
{
static typename std::enable_if<std::is_floating_point<T>::value, int>::type
print(T x, char * out, std::size_t n)
{
return std::snprintf(out, n, "%f", x);
}
};
// Convenience function wrapper
template <typename T> int print(T x, char * out, std::size_t n)
{
return Printer<T>::print(x, out, n);
}
void f()
{
char a[10];
Printer<double>::print(1.2, a, 10); // use helper class
print(1.4f, a, 10); // wrapper deduces type for you
}
如果您使用非浮动类型调用任一构造,您将收到编译时错误。但请注意,这可能会错误地适用于长双打,这需要%Lf
格式说明符;还记得当通过可变参数函数参数传递时,浮点数会提升为双精度数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)