如何控制operator []赋值

时间:2017-03-28 10:34:40

标签: c++ operator-overloading operator-keyword

我知道如何重载operator[]如下:

T& operator [](int idx) {
    return TheArray[idx];
}

T operator [](int idx) const {
    return TheArray[idx];
}

但我想要的是控制arr[i] = value指定的值。 我想控制值在0到9之间。 有没有语法可以这样做?

2 个答案:

答案 0 :(得分:6)

您必须编写一个模板类,其中包含对数组中元素的引用(类型为T),在此模板中,您可以实现赋值运算符,并且可以在那里实现检查。然后从[]运算符返回此模板类的对象。

这样的事情:

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;
};

答案 1 :(得分:3)

雷恩提供了一个很好的答案。除此之外,这里有一个完整的例子。请注意,我在operator T类中添加了“用户定义的转化”,即proxy_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;
}