コンパイラがそれ自体で型を設定できる関数テンプレートがある場合typename T
、次のように関数を呼び出すときに型を明示的に記述する必要はありません。
template < typename T >
T min( T v1, T v2 ) {
return ( v1 < v2 ) ? v1: v2;
}
int i1 = 1, i2 = 2; int i3 = min( i1, i2 ); //no explicit <type>
しかし、次のような 2 つの異なる型名を持つ関数テンプレートがあるとします。
template < typename TOut, typename TIn >
TOut round( TIn v ) {
return (TOut)( v + 0.5 );
}
double d = 1.54;
int i = round<int>(d); //explicit <int>
常に少なくとも 1 つの型名を指定する必要があるというのは本当ですか? その理由は、C++ が異なる戻り値の型間で関数を区別できないためだと思います。
しかし、void 関数を使用して参照を渡す場合も、戻り値の型名を明示的に指定してはなりません。
template < typename TOut, typename TIn >
void round( TOut & vret, TIn vin ) {
vret = (TOut)(vin + 0.5);
}
double d = 1.54;
int i; round(i, d); //no explicit <int>
結論として、return を伴う関数を避け、void
テンプレートを作成するときに参照を介して戻る関数を優先する必要がありますか? または、戻り値の型を明示的に記述しないようにする可能性はありますか? テンプレートの「型推論」のようなもの。C++0xで「型推論」は可能ですか?