如何检查正确操作数以通过参考返回功能
How to check right operand for functions return by reference?
说我正在实现元素访问操作员[],以从自定义的向量类访问单个元素。这样的东西:
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]);
}
}
请注意,这不是运行代码。这只是为了展示这个概念。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- C++错误消息*成员参考.**初学者*
- 是否有一种方法可以避免在RVALUE和LVALUE参考中创建功能时避免重复的代码
- 模板功能不使用RVALUE参考实例化/接收呼叫
- 如何编写工厂功能以在C 中初始化constexpr参考
- 如何检查正确操作数以通过参考返回功能
- C 超载相等运算符.我应该写自己的功能以接受通过参考或值传递的参数
- Lambda通过参考传递的功能
- 提供功能版本,其中可用值和参考
- C 功能具有参考参数错误的迭代器错误.寻求解释
- CLION不确定对功能的参考
- C 性能:通过参考通过对象与功能的对象传递
- rvalue参考绑定到std ::功能类型的LVALUE
- 编译器无法在循环递归参考中找到功能
- 通过参考辅助功能传递随机数生成器MT19937是正确的吗?
- 通过递归模板中的参考传递模板功能
- 从基本指针/参考调用正确的免费功能
- 我在哪里可以找到一个官方的参考资料,列出了上交所的内在功能的运作