当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何编写适用于32位和64位的std::bitset模板》经验,为你挑选了1个好方法。

请考虑以下代码

template void foo(std::bitset 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>,但有没有办法重新编写模板部分,以便它可以使用数字文字的默认解释?



1> Johannes Sch..:

问题不在于你是否写作8u8.问题与功能模板的模板参数类型有关.它的类型必须与声明中使用的类型相匹配std::bitset.那是size_t根据标准(部分23.3.5)

namespace std {
    template class bitset {
    public:
    // bit reference:
        ...

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

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

但在其他场合,类型必须匹配.请注意,这仅适用于自动调整的模板参数,但不适用于明确给定的参数.原因是,对于推导出的,编译器会尝试找出实际模板参数与从调用中推断出的最佳匹配.那时许多其他隐含的转换是不允许的.如果你明确地设置了参数,你可以获得全方位的转换(忽略size_t现在使用的解决方案来表达我的观点)

template void foo(std::bitset bs)
{ /* whatever */ }

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

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有