gpt4 book ai didi

c++ - 如何使用运算符来专门化模板?

转载 作者:行者123 更新时间:2023-12-01 14:54:12 25 4
gpt4 key购买 nike

我想通过TMP将1到N-1的数字相加。因此我编写了如下所示的源代码,但是发生了template argument '(number - 1)' involves template parameter(s)错误。你碰巧知道如何处理吗?

template <int number, int i = 1>
class Sum {
public:
static const int result = i + Sum<number, i + 1>::result;
};

template <int number>
class Sum<number, number - 1> {
public:
static const int result = number - 1;
};

int main () {
const int result = Sum<10>::result;
return 0;
}

最佳答案

GCC仍然遵循the rule:

Non-type argument expression cannot use the name of the template parameter except when it is exactly the name of the template parameter.



要使用模板特化解决问题,可以将第二个非类型模板参数包装到 std::integral_constant中,使其成为类型模板参数:
template<int number, class i = std::integral_constant<int, 1>>
struct Sum {
static constexpr int value = i() + Sum<number,
std::integral_constant<int, i() + 1>>::value;
};

template<int number>
struct Sum<number, std::integral_constant<int, number - 1>> {
static constexpr int value = number - 1;
};

static_assert(Sum<10>::value == 45);

另外,您可以使用 if constexpr而不使用部分特化:
template<int number, int i = 1>
struct Sum {
static constexpr int value = [] {
if constexpr (number == i + 1)
return i;
else
return i + Sum<number, i + 1>::value;
}();
};

static_assert(Sum<10>::value == 45);

折叠表达式给出了另一种方式:
template<class> struct Sum_impl;

template<int... numbers>
struct Sum_impl<std::integer_sequence<int, numbers...>> {
static constexpr int value = (... + numbers);
};

template<int number>
struct Sum : Sum_impl<std::make_integer_sequence<int, number>> {};

关于c++ - 如何使用运算符来专门化模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59208047/

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