检查模板中的底片?

时间:2015-03-10 23:25:29

标签: c++ c++11 template-meta-programming

这不是一个非常重要的问题,但它现在已经困扰了我一段时间了。基本上,我已经开始使用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 };
};

1 个答案:

答案 0 :(得分:4)

例如,像这样:

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