此问题是this one之后的后续问题。实际问题是Visual Studio 2012不支持默认模板参数 for function templates ,如this list所示。
由于Visual Studios 2012不支持默认模板参数,如果没有它,是否有任何解决方法可以获得相同的结果?因此可以定义模板函数,例如
template <typename T, typename Ret = T>
Ret round(T val, Ret ret = Ret()) {
return static_cast<Ret>(
(val >= 0) ?
floor(val + (T)(.5)) :
ceil( val - (T)(.5))
);
}
不使用默认模板参数?该功能用作
auto a = round(5.5, int()); // int a = 6
auto b = round(5.5); // double b = 6.0
答案 0 :(得分:1)
同样,传递一个值来强制返回类型也不是一个很好的方法,而是使用模板参数:
#include <iostream>
#include <cmath>
template <typename Ret, typename T>
Ret round( T val ) {
return static_cast<Ret>(
( val >= 0 ) ?
std::floor( val + (T) ( .5 ) ) :
std::ceil( val - (T) ( .5 ) )
);
}
template <typename T>
T round( T val ) {
return round<T,T>( val );
}
auto a = round<int>( 5.5 ); // int a = 6
auto b = round( 5.5 ); // double b = 6.0
static_assert( std::is_same<decltype(a), int>::value, "a must be int" );
static_assert( std::is_same<decltype(b), double>::value, "b must be double" );
int main() {
std::cout << a << " " << b;
}