考虑下面的元函数,它是一个整数pow(仅作为示例):

class Meta
{
    template<int N, typename T> static constexpr T ipow(T x)
    {
        return (N > 0) ? (x*ipow<N-1>(x))
                       : ((N < 0) ? (static_cast<T>(1)/ipow<N>(x))
                                  : (1))
    }
};


如何编写此类功能的停止条件?

最佳答案

每当您问自己“如何模拟函数的部分专用化”时,您都可以考虑“过载,并让部分排序决定哪种过载更特殊”。

template<int N>
using int_ = std::integral_constant<int, N>;

class Meta
{
    template<int N, typename T> static constexpr T ipow(T x)
    {
        return ipow<N, T>(x, int_<(N < 0) ? -1 : N>());
    }

    template<int N, typename T> static constexpr T ipow(T x, int_<-1>)
    {
        //                             (-N) ??
        return static_cast<T>(1) / ipow<-N>(x, int_<-N>());
    }

    template<int N, typename T> static constexpr T ipow(T x, int_<N>)
    {
        return x * ipow<N-1>(x, int_<N-1>());
    }

    template<int N, typename T> static constexpr T ipow(T x, int_<0>)
    {
        return 1;
    }
};


我认为您想在带有注释的位置传递-N而不是N

09-30 14:03