如何写一个std :: bitset的模板,在32位和64位的作品 [英] How to write a std::bitset template that works on 32 and 64-bit

查看:436
本文介绍了如何写一个std :: bitset的模板,在32位和64位的作品的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

考虑以下code

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

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

G ++这个在64位抱怨,因为在&lt; 8>得到PTED为unsigned long int类型,不模板完全匹配除$ P $。如果我更改模板说unsigned long int类型,然后32位编译抱怨。

g++ complains about this on 64 bit because the <8> gets interpreted as an unsigned long int, which doesn't exactly match the template. If I change the template to say unsigned long int, then 32-bit compiles complain.

要解决这个问题显然,一个办法是改变位集合&LT; 8>以bitset的&LT; 8ul>,但有什么办法可以重新写的模板的一部分,这样它会与任何默认数字文字间pretation是?

Obviously one way to fix this is to change bitset<8> to bitset<8ul>, but is there any way to re-write the template part so that it will work with whatever the default interpretation of a numeric literal is?

推荐答案

问题不在于你是否写 8U 8 。这个问题,是因为有你的函数模板的模板参数的类型。它的类型必须匹配在的std :: bitset的声明中使用的之一。这是为size_t 根据标准(第 23.3.5

The problem isn't whether or not you write 8u or 8. The problem has to do with the type of the template parameter of your function template. Its type has to match the one used in the declaration of std::bitset. That's size_t according to the Standard (section 23.3.5)

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

唯一的例外是阵列的尺寸,以便您可以使用任何整数类型(甚至布尔 - 那么可以接受的唯一的大小 1 当然):

The exception are array dimensions, for which you can use any integer type (even bool - then the only size that can be accepted is 1 of course):

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

但在其他场合,类型必须匹配。请注意,这是唯一真正的autodeduced模板参数,而不是明确给定的。其原因是,推导的,编译器试图找出实际的模板参数,它从调用推导出它之间的最佳匹配。否则,许多隐式转换是不允许的话。你有全系列的可用转换,如果你把明确的说法(忽略使用的解决方案为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
}

这篇关于如何写一个std :: bitset的模板,在32位和64位的作品的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆