В метапрограмме шаблона можно использовать 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]; }
};
Однако это не работает над конструкторами. Предположим, я хочу объявить конструктор
template<int N> struct A {
/* ... */
template<int otherN>
explicit(A<otherN> const&); // only sensible if otherN >= N
};
но запретите его для otherN < N
.
Итак, можно использовать SFINAE здесь? Меня интересуют только решения, которые позволяют автоматическое вычитание параметров шаблона, так что
A<4> a4{};
A<5> a5{};
A<6> a6{a4}; // doesn't compile
A<3> a3{a5}; // compiles and automatically finds the correct constructor
Примечание. Это очень упрощенный пример, в котором SFINAE может быть избыточным и static_assert
может быть достаточным. Тем не менее, я хочу знать, может ли я использовать использовать SFINAE.