Jak używać sfinae do wybierania konstruktorów?
W szablonowym meta programowaniu można użyć SFINAE natyp powrotu aby wybrać określoną funkcję członka szablonu, tj.
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]; }
};
Nie działa to jednak na konstruktorach. Załóżmy, że chcę zadeklarować konstruktor
template<int N> struct A {
/* ... */
template<int otherN>
explicit(A<otherN> const&); // only sensible if otherN >= N
};
ale nie zezwalaj na tootherN < N
.
Więc,czy można tutaj używać SFINAE? Interesują mnie tylko rozwiązania, które pozwalają na automatyczne odliczanie parametrów szablonu, więc
A<4> a4{};
A<5> a5{};
A<6> a6{a4}; // doesn't compile
A<3> a3{a5}; // compiles and automatically finds the correct constructor
Uwaga: jest to bardzo uproszczony przykład, w którym SFINAE może być przesada istatic_assert
może wystarczyć. Chcę jednak wiedzieć, czy jamogą zamiast tego użyj SFINAE.