如何检查正确操作数以通过参考返回功能

How to check right operand for functions return by reference?

本文关键字:参考 功能 返回 操作数 何检查 检查      更新时间:2023-10-16

说我正在实现元素访问操作员[],以从自定义的向量类访问单个元素。这样的东西:

vector A;
int a = A[2]; // access the 3rd element

由于运算符的实现通常是通过引用返回的,因此可以将其链接为以下操作

A[2] = 7; 

我的问题是,在第二次用法中,[2] = 7,是否有一种方法可以检查正确的操作数,即在此示例中7。我希望此功能在某些情况下,向量类是二进制向量,因此只能为其分配0或1。我想检查正确的操作数,以确保禁止0/1以外的任何数字分配。谢谢。

您可以考虑两种方式。

第一个是使用像这样的代理对象

class vector {
    std::vector<int> _v;
public:
    vector(int i) : _v(i) {}
    class Proxy {
        int &_i;
    public:
        Proxy(int& i) : _i(i) {}
        Proxy& operator=(int i) { if (i != 1) throw; _i = i; return *this; }
        operator int() { return _i; }
    };
    Proxy operator[](int i) { return Proxy(_v[i]); }
};
int main()
{
    vector v(5);
    v[1] = 1; // ok
    v[2] = 2; // throw
}

第二个是使用enum class或仅接受0和1而不是int的类。此选项在这里可能会更好,因为它传达了用户的语义,而使用int并不表示休闲读取器0和1是唯一可接受的值。

您可以将助手类用于此目的,从而超载分配运算符(operator=(。数组下标运算符返回助手类的对象,而不是数组元素。为此对象分配一个值,请调用分配的操作员,该操作员在必要时实现支票分配值。

类似的东西:

class vector {
    struct bucket {
        private int &_element;
        bucket(int &inElement): _element(inElement) {
        }
        int &operator=(int inValue) {
            // Do your checks here
            _element = inValue;
            return _element;
        }
    }
    bucket operator[](int i) {
        return bucket(_elements[i]);
    }
}

请注意,这不是运行代码。这只是为了展示这个概念。