检查模板中的底片?

Checking for negatives in template?

这不是一个非常重要的问题,但它已经困扰我一段时间了。基本上,我开始学习使用 C++ 中的模板进行元编程只是因为它看起来很有趣。在学习中我发现了简单的阶乘例子:

template <int n>
struct factorial {
    enum { value = factorial<n - 1>::value };
};

template <>
struct factorial<0> {
    enum { value = 1 };
};

在此基础上,我想添加我自己的部分,该部分来自我的一个朋友正在上的介绍课程中的一个非常基础的程序作业。我需要添加的唯一额外部分是如果给定的数字为负数则打印 -1。

这就是我遇到问题的地方。我尝试了几种不同的方法,但它很快就会失控,而且大多数时候错误都非常混乱。在这一点上,我想知道是否有可能简单地做这样的事情。起初我以为它会像这样简单:

template <int n>
struct factorial {
    enum { value = (n < 0) ? -1 : factorial<n>::value };
};

template <>
struct factorial<0> {
    enum { value = 1 };
};

但这在编译器中运行,直到它在给定一个负数时退出。我还尝试了几种不同的方法,包括制作 2-6 个以上的函数和临时 typedef 以及其他方法,但它变成了一大堆错误。

简而言之:如果给定的数字是负数,有没有办法有条件地执行另一个模板?例如,像这样:

template <int n>
struct factorial {
    enum { value = factorial<n, negative<n>::value>::value };
};

template <>
struct factorial<0> {
    enum { value = 1 };
};

template <>
struct factorial<(n < 0)> {
    enum { value = -1 };
};

例如,像这样:

namespace detail {
    template <int n, bool isNegative>
    struct factorial_impl {
        enum { value = n * factorial_impl<n - 1, isNegative>::value };
    };

    template <int n>
    struct factorial_impl<n, true> {
        enum { value = -1 };
    };

    template <>
    struct factorial_impl<0, false> {
        enum { value = 1 };
    };
}

template <int n>
struct factorial {
    enum { value = detail::factorial_impl<n, n < 0>::value };
};

DEMO