如何控制运算符[]分配的值
How to control value assigned by operator []
我知道如何重载 operator[]
如下:
T& operator [](int idx) {
return TheArray[idx];
}
T operator [](int idx) const {
return TheArray[idx];
}
但我想要的是控制arr[i] = value
分配的值。
我想控制值在 0 到 9 之间。
有什么语法可以这样做吗?
您必须编写一个模板 class 来保存对数组(T 类型)中元素的引用,在该模板中您可以实现赋值运算符,并可以在其中实现您的检查。然后你 return 这个模板的对象 class 从你的 [] 运算符。
像这样:
template< typename T> class RangeCheck
{
public:
RangeCheck( T& dest): mDestVar( dest) { }
RangeCheck& operator =( const T& new_value) {
if ((0 <= new_value) && (new_value < 9)) { // <= ??
mDestVar = new_value;
} else {
... // error handling
}
return *this;
}
private:
T& mDestVar;
};
Rene 提供了一个很好的答案。除此之外,这是一个完整的例子。请注意,我在 proxy_T
class.
中添加了一个 "user-defined conversion",即 operator T
#include <iostream>
#include <array>
#include <stdexcept>
template <class T>
class myClass
{
std::array<T, 5> TheArray; // Some array...
class proxy_T
{
T& value; // Reference to the element to be modified
public:
proxy_T(T& v) : value(v) {}
proxy_T& operator=(T const& i)
{
if (i >= 0 and i <= 9)
{
value = i;
}
else
{
throw std::range_error(std::to_string(i));
}
return *this;
}
operator T() // This is required for getting a T value from a proxy_T, which make the cout-lines work
{
return value;
}
};
public:
proxy_T operator [](int const idx)
{
return TheArray.at(idx);
}
T operator [](int const idx) const
{
return TheArray[idx];
}
};
int main() {
myClass<int> A;
std::cout << A[0] << std::endl;
A[0] = 2;
std::cout << A[0] << std::endl;
A[1] = 20;
}
我知道如何重载 operator[]
如下:
T& operator [](int idx) {
return TheArray[idx];
}
T operator [](int idx) const {
return TheArray[idx];
}
但我想要的是控制arr[i] = value
分配的值。
我想控制值在 0 到 9 之间。
有什么语法可以这样做吗?
您必须编写一个模板 class 来保存对数组(T 类型)中元素的引用,在该模板中您可以实现赋值运算符,并可以在其中实现您的检查。然后你 return 这个模板的对象 class 从你的 [] 运算符。
像这样:
template< typename T> class RangeCheck
{
public:
RangeCheck( T& dest): mDestVar( dest) { }
RangeCheck& operator =( const T& new_value) {
if ((0 <= new_value) && (new_value < 9)) { // <= ??
mDestVar = new_value;
} else {
... // error handling
}
return *this;
}
private:
T& mDestVar;
};
Rene 提供了一个很好的答案。除此之外,这是一个完整的例子。请注意,我在 proxy_T
class.
operator T
#include <iostream>
#include <array>
#include <stdexcept>
template <class T>
class myClass
{
std::array<T, 5> TheArray; // Some array...
class proxy_T
{
T& value; // Reference to the element to be modified
public:
proxy_T(T& v) : value(v) {}
proxy_T& operator=(T const& i)
{
if (i >= 0 and i <= 9)
{
value = i;
}
else
{
throw std::range_error(std::to_string(i));
}
return *this;
}
operator T() // This is required for getting a T value from a proxy_T, which make the cout-lines work
{
return value;
}
};
public:
proxy_T operator [](int const idx)
{
return TheArray.at(idx);
}
T operator [](int const idx) const
{
return TheArray[idx];
}
};
int main() {
myClass<int> A;
std::cout << A[0] << std::endl;
A[0] = 2;
std::cout << A[0] << std::endl;
A[1] = 20;
}