Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使运算符[]返回对无符号整数中单个位的引用?_C++_Vector_Reference_Bit Manipulation_Operator Keyword - Fatal编程技术网

C++ 如何使运算符[]返回对无符号整数中单个位的引用?

C++ 如何使运算符[]返回对无符号整数中单个位的引用?,c++,vector,reference,bit-manipulation,operator-keyword,C++,Vector,Reference,Bit Manipulation,Operator Keyword,我正在做一个向量实现。我保存一个无符号整数,并使用逐位运算得到一个true和false向量。我的问题是,;我可以通过运算符[]访问单个位,但如何获取对此类位的引用以便写入 Vector<bool> v(5, true); v[3] = false; 向量v(5,真); v[3]=假; 在某个地方,我听说你不应该引用或指向单个位。用于检索位值的代码摘要: ... unsigned int arr; // Store bits as unsigned int unsign

我正在做一个
向量
实现。我保存一个无符号整数,并使用逐位运算得到一个true和false向量。我的问题是,;我可以通过运算符[]访问单个位,但如何获取对此类位的引用以便写入

Vector<bool> v(5, true);
v[3] = false;
向量v(5,真); v[3]=假; 在某个地方,我听说你不应该引用或指向单个位。用于检索位值的代码摘要:

...
unsigned int arr;       // Store bits as unsigned int
unsigned int size_vec;  // The size of "bool vector"
...

bool& Vector<bool>::operator[](unsigned int i) {
 if (i>=vec_size || i<0) {
    throw out_of_range("Vector<bool>::operator[]");
 }
 int index = 1 << (i-1);
 bool n = false;
 if (index & arr) {
     n=true;
 }
 return n;
};
。。。
无符号整数arr;//将位存储为无符号整数
无符号整数大小_vec;//“布尔向量”的大小
...
布尔&向量::运算符[](无符号整数i){

如果(i>=vec_size | | i,则需要使用适当的运算符重载定义代理对象,使其行为类似于
bool&
,但处理单个位。这就是
std::vector
所做的

大概是这样的:

struct Bit
{
public:
    typedef unsigned char byte;

    Bit(byte& _byte, byte _bit)
    : m_byte(_byte), m_mask(1u << _bit)
    {}

    operator bool() const
    {
        return m_byte & m_mask;
    }

    Bit& operator=(bool x)
    {
        m_byte = x ? m_byte | m_mask : m_byte & ~m_mask;
        return *this;
    }

private:
    byte& m_byte;
    const byte m_mask;
};
struct位
{
公众:
typedef无符号字符字节;
位(字节和字节,字节位)

:m_字节(_字节)、m_掩码(1u您不能引用单个位。只能引用变量


您可以做的事情是创建一个代理类,该类公开对
bool
的引用,并维护对基整数的内部引用以及必要的位篡改机制;然后创建
[]
-运算符返回这样一个代理对象。

您不能通过返回对bool的引用来实现。您需要创建并返回一个代理对象,并重载其赋值运算符,例如

struct bit_access_proxy {
    bit_access_proxy(int& carrier, int bit) { ... }
    operator bool() const {
        // return the value of the bit
    }
    bit_access_proxy& operator=(bool new_bit) {
        // set the value of the bit
    }
};

bit_access_proxy Vector<bool>::operator[](int i) { ... }
struct bit\u access\u proxy{
位访问代理(int&carrier,int位){…}
运算符bool()常量{
//返回位的值
}
位访问代理和运算符=(布尔新位){
//设置位的值
}
};
位访问代理向量::运算符[](int i){…}
你不能

您最好返回一个代理对象

起点:

struct bit {
  bit(Vector<bool>* vec, size_t pos);
  bit& operator=(const bool& b);
  operator bool();
  Vector<bool>* vec;
  size_t pos;
};

bit Vector<bool>::operator[](size_t pos) {
 return bit(this, pos);
};
struct位{
位(向量*vec,大小\u t位置);
位和运算符=(常量布尔和b);
运算符bool();
向量*vec;
尺寸和位置;
};
位向量::运算符[](大小\u t位置){
返回位(此,pos);
};

天哪不,我们不需要另一个
向量
实现——一个就足够了!不幸的是,给我任务的人不同意……冰箱正在发生什么——一百万个问题似乎都是合理的,一有明智的建议,突然,“哦,我不允许XYZ因为ABC的原因,但是我觉得不告诉你这件事更有趣。”吸血鬼!“安德鲁。巴伯:我的观点是,许多新的海报不诚实,而且是坦率的。所以人们会努力思考,并试图提出聪明的C++解决方案,但他们只能说:”哦,我的教授不想去STL。“或者是一些胡说八道。C++和教育编码体操有很大的区别,人们应该这么说。”USER 1067 171:“真正的”答案是“不要这样做”,你说“不,我不能做这件事”:-)在任何情况下,标记都是迄今为止您必须了解和使用的最重要的标记。其次,查看
std::bitset
了解一些想法。如果我然后键入:int I=v[3];?这对代理无效?什么是运算符bool()?@user1067171:
v[3]
将返回一个
位访问\u代理
int i=…
将使用
操作符bool()
将代理转换为
bool
并将其分配给
int
。谢谢。我明天会尝试,因为有时我们都需要一些睡眠;)