Como usar sfinae para selecionar construtores?
Na meta-programação de template, pode-se usar o SFINAE notipo de retorno para escolher uma determinada função de membro de modelo, ou seja,
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]; }
};
No entanto, isso não funciona em construtores. Suponha que eu queira declarar o construtor
template<int N> struct A {
/* ... */
template<int otherN>
explicit(A<otherN> const&); // only sensible if otherN >= N
};
mas desaprová-lo porotherN < N
.
Assim,SFINAE pode ser usado aqui? Estou interessado apenas em soluções que permitem a dedução automática de parâmetro de modelo, de modo que
A<4> a4{};
A<5> a5{};
A<6> a6{a4}; // doesn't compile
A<3> a3{a5}; // compiles and automatically finds the correct constructor
Nota: este é um exemplo muito simplificado onde SFINAE pode ser um exagero estatic_assert
pode ser suficiente. No entanto, eu quero saber se euposso use SFINAE em vez disso.