gpt4 book ai didi

c++ - 专门针对受约束的非类型参数模板化的类

转载 作者:行者123 更新时间:2023-12-05 01:03:55 27 4
gpt4 key购买 nike

让我们考虑以下代码用于阶乘函数的编译时评估:

#include <concepts>

template <std::integral auto num>
struct factorial {
constexpr static auto val{num * factorial<num - 1>::val};
};

// Note: This only specializes the class for (int)0
template <>
struct factorial<0> {
constexpr static auto val{1};
};

// ...

factorial<4>::val; // Ok: 24
factorial<4u>::val; // error: template instantiation depth exceeds maximum of 900
// This makes sense: There's no factorial<0u> specialization.

有没有办法引入专精factorial<0>对于所有整数类型(即所有满足 std::integral 的类型)?

当然,我想避免实际写出专业 factorial<0u> , factorial<0l> ,等等。

最佳答案

您可以部分专门化任何比较相等的值,而不是显式地专门针对 0(即一个 int 的值为 0)到0:

template <std::integral auto I> requires (I == 0)
struct factorial<I> {
static constexpr auto val = 1;
};

如果您愿意,也可以这样拼写:

template <class T, T I> requires (I == 0)
struct factorial<I> {
static constexpr auto val = 1;
};

但我认为没有办法将 T{0} 推断为值。

关于c++ - 专门针对受约束的非类型参数模板化的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73158620/

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