class MyContainerClass {
public:
int& operator[](unsigned int index);
int operator[](unsigned int index) const;
// ...
};
Возврат ссылки позволяет пользователю использовать результат в качестве lvalue, как в вашем примере MyInstance[3] = 5;
. Добавление перегрузки const
гарантирует, что они не смогут сделать это, если MyInstance
является const
переменной или ссылкой.
Но иногда вы хотите, чтобы все выглядело так, но на самом деле у вас нет int
, на который вы можете сослаться. Или, может быть, вы хотите разрешить несколько типов в правой части MyInstance[3] = expr;
. В этом случае вы можете использовать фиктивный объект, который перегружает присваивание:
class MyContainerClass {
private:
class Index {
public:
Index& operator=(int val);
Index& operator=(const string& val);
private:
Index(MyContainerClass& cont, unsigned int ind);
MyContainerClass& m_cont;
unsigned int m_ind;
friend class MyContainerClass;
};
public:
Index operator[](unsigned int ind) { return Index(*this, ind); }
int operator[](unsigned int ind) const;
// ...
};