gpt4 book ai didi

c++ - 模板递归中的非类型模板参数缩小

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:59 25 4
gpt4 key购买 nike

我有以下代码,它应该在编译时计算一个字节中的位数。

template<unsigned char c, size_t I>
struct char_bit
{
static constexpr size_t get() noexcept {
return c > 0 ? char_bit<c << 1, I + 1>::get() : I
}
};

int main()
{
std::cout << char_bit<1, 0>::get();
}

通过将 1 传递给 unsigned char 参数,我期望得到最终结果 8,因为它将向左移动 8 次,直到 char 变为 0 .

但是,使用 Clang 3.7.1 编译时,出现编译错误:

error: non-type template argument evaluates to 256, which cannot be narrowed to type 'unsigned char' [-Wc++11-narrowing]

为什么会这样?我该如何解决?

最佳答案

避免此错误的一种方法是反向操作:不是溢出您的字符,而是从最大值开始并右移直到达到零。您将需要特化才能使代码正常工作(无论如何您都需要它):

#include <iostream>
using namespace std;

template<unsigned char c, size_t I>
struct char_bit
{
static constexpr size_t get() noexcept {
return char_bit< (c >> 1), I + 1>::get();
}
};

template<size_t I>
struct char_bit<0, I>
{
static constexpr size_t get() noexcept {
return I;
}
};


int main()
{
constexpr unsigned char c = static_cast<unsigned char>(-1);
std::cout << char_bit<c, 0>::get();
}

关于c++ - 模板递归中的非类型模板参数缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38242016/

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