gpt4 book ai didi

c++ - 如何编写适用于 32 位和 64 位的 std::bitset 模板

转载 作者:可可西里 更新时间:2023-11-01 17:38:43 25 4
gpt4 key购买 nike

考虑以下代码

template<unsigned int N> void foo(std::bitset<N> bs)
{ /* whatever */ }

int main()
{
bitset<8> bar;
foo(bar);
return 0;
}

g++ 在 64 位上提示这个,因为 <8> 被解释为 unsigned long int,它与模板不完全匹配。如果我将模板更改为 unsigned long int,则 32 位编译会报错。

显然,解决此问题的一种方法是将 bitset<8> 更改为 bitset<8ul>,但是有什么方法可以重写 template 部分,以便它可以使用任何默认值数字文字的解释是?

最佳答案

问题不在于你写的是 8u 还是 8。问题与函数模板的模板参数类型有关。它的类型必须与 std::bitset 声明中使用的类型相匹配。根据标准(23.3.5 节),这是 size_t

namespace std {
template<size_t N> class bitset {
public:
// bit reference:
...

数组维度除外,您可以使用任何整数类型(甚至 bool - 那么唯一可以接受的大小当然是 1):

// better size_t (non-negative), but other types work too
template<int N> void f(char(&)[N]);

但在其他场合,类型必须匹配。请注意,这仅适用于自动推导的模板参数,但不适用于显式给定的模板参数。原因是对于推导的参数,编译器试图找出实际模板参数与它从调用它推导出的内容之间的最佳匹配。那么许多其他隐式转换是不允许的。如果您将参数显式化(忽略现在使用 size_t 的解决方案来说明我的观点),您将获得所有可用的转换范围

template<int N> void foo(std::bitset<N> bs)
{ /* whatever */ }

int main() {
bitset<8> bar;
foo<8>(bar); // no deduction, but full range of conversions
}

关于c++ - 如何编写适用于 32 位和 64 位的 std::bitset 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/645168/

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