В метапрограммировании шаблонов можно использовать 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 здесь?
-> std::enable_if<I, decltype(f(_data[0]))>::type
? (может быть, добавитеtypename
передstd::enable_if
) - person David Rodríguez - dribeas   schedule 29.01.2013auto
для вывода типа самого вызова функции, напримерauto f() -> decltype(f()) { /* ... */ }
, все еще неоднородна. - person Kerrek SB   schedule 29.01.2013BinaryOp
с двумя аргументами, но ваш конечный возвращаемый тип утверждает, что этот тип является типом возвращаемого значения оценкиUnaryFunc
... - person David Rodríguez - dribeas   schedule 29.01.2013auto
у меня: я что-то не так делаю? Я просто делаюA<3> a; a.sum()
, и он отказывается компилироваться. - person Andy Prowl   schedule 29.01.2013