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

Posted

技术标签:

【中文标题】如何编写适用于 32 位和 64 位的 std::bitset 模板【英文标题】:How to write a std::bitset template that works on 32 and 64-bit 【发布时间】:2010-10-13 07:26:05 【问题描述】:

考虑下面的代码

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

int main()

    bitset<8> bar;
    foo(bar);
    return 0;

g++ 在 64 位上抱怨这一点,因为 被解释为无符号长整数,它与模板不完全匹配。如果我将模板更改为 unsigned long int,则 32 位编译器会报错。

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

【问题讨论】:

【参考方案1】:

无论平台如何,数字文字都应解释为 int

【讨论】:

进一步的问题是我不能只将其设为模板 因为位集抱怨它的参数必须是无符号整数【参考方案2】:

使用size_t。至少 MSDN 是这么说的。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于如何编写适用于 32 位和 64 位的 std::bitset 模板的主要内容,如果未能解决你的问题,请参考以下文章

如何编写同时兼容 32 位和 64 位的代码?

电脑32位和64位有啥区别 电脑32位和64位的区别

32位和64位有啥区别 32位和64位区别都有哪些

32位和64位的区别

系统32位和64位的区别

如何在64位windows7上同时使用32位和64位的Eclipse