0

この質問は、この質問の後のフォローアップです。実際の問題は、このリストで示されているように、関数テンプレートの既定のテンプレート パラメーターがVisual Studio 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 に答える