テンプレート メタ プログラミングでは、戻り値の型に SFINAE を使用して、特定のテンプレート メンバー関数を選択できます。
template<int N> struct A {
int sum() const noexcept
{ return _sum<N-1>(); }
private:
int _data[N];
template<int I> typename std::enable_if< I,int>::type _sum() const noexcept
{ return _sum<I-1>() + _data[I]; }
template<int I> typename std::enable_if<!I,int>::type _sum() const noexcept
{ return _data[I]; }
};
ただし、この例のように、問題の関数 (_sum()
上記の例) に自動検出された戻り値の型がある場合、これは機能しません。_func()
template<int N> class A
{
/* ... */
private:
// how to make SFINAE work for _func() ?
template<int I, typename BinaryOp, typename UnaryFunc>
auto _func(BinaryOp op, UnaryFunc f) const noexcept -> decltype(f(_data[0]))
{ return op(_func<I-1>(op,f),f(_data[I])); }
};
ここで SFINAE を取得するには、他に何ができますか?