最初の引数が定義されている場合は最初の引数タイプを選択し、そうでない場合は2番目の引数タイプを選択するテンプレート式が必要です。
select<int, float>::type // type evaluates to int
select<an_undefined_type, float>::type // type evaluates to float
...そしてソリューションはC++03とBoost1.33.1で動作する必要があります:(
私の目標は、関数テンプレートパラメータint
としてとの両方を受け入れることです。そのため、次のようなことができます。boost::optional<int>
T
template<typename T>
void fn(T& t)
{
int x = std::numeric_limits<select<T::value_type, T>::type>::digits;
}
boost::optional<int>::value_type
が定義されているので。
C++11ソリューションも高く評価されています。
タイプではなく概念に特化しようとしているので、テンプレートの特殊化でこれを行う方法がわかりません。基本的に、コンセプトに一致する1つのany_integer
スペシャライゼーションと、コンセプトに一致する1つのスペシャライゼーションが必要になりboost::optional<any_integer>
ます。
C ++ 11を使用すると、次の方法でこの特定の目標を達成できると思います。
std::conditional<std::is_integral<T>::value, T, T::value_type>::value
しかし、私はC ++ 11を持っていないので、より一般的な解決策が必要です。