c++ - 如何检查通过引用返回的函数的正确操作数?

标签 c++ arrays vector

假设我正在实现一个元素访问运算符 [] 以访问自定义 vector 类中的单个元素。像这样:

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

由于operator[]的实现一般都是引用返回,所以也可以链式做下面的操作

A[2] = 7; 

我的问题是,在第二种用法 A[2] = 7 中,有没有办法检查正确的操作数,即本例中的 7。我想要这个功能,因为在某些情况下, vector 类将是一个二进制 vector ,因此只能为其分配 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 是唯一可接受的值。

关于c++ - 如何检查通过引用返回的函数的正确操作数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48636116/

相关文章:

java - Java中这两个语句有什么区别?

c++ - 与 std::vector<>::size() 并发

Java - 对于数组,删除偶数

javascript - 使用 javascript 将带有数组的表单转换为逗号分隔的查询字符串,且不重复

c++ - 在 C++ 中初始化 boolean vector 的标准方法是什么

c++ - Vector.erase 中的 SIGSEGV

c++ - 程序不保存输入的条目? (C++)

c++ - 执行cv::warp对一组cv::Point进行假校正

c++ - 控制台应用程序不打印 "Press any key to continue . . ."

c++ - 在 QML 中的 VideoOutput 上显示用 C++ 创建的相机