0

这个问题是这个问题之后的后续问题。实际问题是Visual Studios 2012 不支持函数模板的默认模板参数,如此列表所示。


由于 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
4

1 回答 1

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; 
}
于 2014-02-16T13:17:35.197 回答