Consider the following metafunction for an integral pow (it is just an example) :
class Meta
{
template static constexpr T ipow(
Anytime you ask yourself "how to simulate partial specialization for functions", you can think "overload, and let partial ordering decide what overload is more specialized".
template
using int_ = std::integral_constant;
class Meta
{
template static constexpr T ipow(T x)
{
return ipow(x, int_<(N < 0) ? -1 : N>());
}
template static constexpr T ipow(T x, int_<-1>)
{
// (-N) ??
return static_cast(1) / ipow<-N>(x, int_<-N>());
}
template static constexpr T ipow(T x, int_)
{
return x * ipow(x, int_());
}
template static constexpr T ipow(T x, int_<0>)
{
return 1;
}
};
I think you wanted to pass -N instead of N at the comment-marked position.