![]() | |
![]() ![]() ![]() |
![]() | Imperfect C++ Practical Solutions for Real-Life Programming By Matthew Wilson |
Table of Contents | |
Chapter 27. Subscript Operators |
27.3. Return ValueSo we've decided on a reasonable strategy for index validation, but there still remains the issue of what we actually return from the subscript operator. Thankfully, the use of the canonical &c[0] makes this pretty simple. We must return something that, when subject to the address-of operator (unary operator &), will yield a pointer to the managed sequence. Hence Double Container returns double& or double const &, either of which will yield a pointer when subjected to the address of operator. I don't know how many of you have done as I have in the past and written naïve pre-STL containers that returned by value, as in: class DoubleContainer { . . . double operator [](size_t index) const; This is simply not good enough. If you return by value, you're introducing a disconnect between the managed sequence and the client code that may wish to meaningfully apply the address-of operator to get a pointer to the managed sequence. That's not to say that you must return a reference. An alternative strategy is to return an instance that can act as a reference. For example, DoubleContainer's operator []() could return an instance of DoubleIndexProxy: class DoubleIndexProxy { . . . double *operator &(); double const *operator &() const; As you can see, this goes against the advice of the last chapter, which is to eschew the overloading of operator &(). In this case, it's fine because no one in their right mind will be attempting to put a DoubleIndexProxy in a container, or indeed use it for any other purpose. In fact, it would be a private nested class within DoubleContainer, so no one can access it save the compiler, and she'll faithfully follow your access control dictates. This seems a reasonable principle, but it falls on its face a bit when we try to use this with multidimensional arrays (see Chapter 33). |
![]() | |
![]() ![]() ![]() |