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.

questionAnswers(3)

yourAnswerToTheQuestion