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