Visual Studios 2012中的默认模板参数

时间:2014-02-16 13:05:18

标签: c++ templates visual-studio-2012 function-templates

此问题是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

1 个答案:

答案 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; 
}