gpt4 book ai didi

c++ - 检查模板中的底片?

转载 作者:太空狗 更新时间:2023-10-29 20:57:55 25 4
gpt4 key购买 nike

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

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

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

在此基础上,我想添加我自己的部分,该部分来 self 的一个 friend 正在参加的介绍类(class)中的一个非常基础的程序作业。我需要添加的唯一额外部分是如果给定的数字为负数则打印 -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

关于c++ - 检查模板中的底片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28975934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com