Rozwiązaniem jest użycie "proxy" obiekt, który opóźni rzeczywistej operacji:
#include <vector>
#include <iostream>
template<typename T>
struct MyArray {
std::vector<T> data;
MyArray(int size) : data(size) {}
struct Deref {
MyArray& a;
int index;
Deref(MyArray& a, int index) : a(a), index(index) {}
operator T() {
std::cout << "reading\n"; return a.data[index];
}
T& operator=(const T& other) {
std::cout << "writing\n"; return a.data[index] = other;
}
};
Deref operator[](int index) {
return Deref(*this, index);
}
};
int main(int argc, const char *argv[]) {
MyArray<int> foo(3);
foo[1] = 42;
std::cout << "Value is " << foo[1] << "\n";
return 0;
}
Proste const
Nie można użyć opcji -ness, ponieważ może zajść potrzeba odczytu z instancji niestałej, to jest powód, dla którego musisz opóźnić operację: przypisanie odbywa się "po" dostępie, a kompilator nie powiedzieć, czy dostęp będzie później używany jako cel przydziału, czy nie.
Pomysł polega więc na tym, że po uzyskaniu dostępu przechowujesz żądany indeks i czekasz na informację, czy operacja czytania lub zapisu jest wykonywana. Dostarczając niejawnego operatora konwersji z serwera proxy do T
wiesz, kiedy pojawia się operacja odczytu, dostarczając i przypisując operatorowi proxy z T
wiesz, kiedy wystąpi zapis.
Czasami warto spojrzeć w górę * * obiekty proxy, które są często używane do rozróżnienia odczytuje z zapisów. – templatetypedef
Zobacz artykuł 30 "Klasy proxy" z [Bardziej efektywne C++ autorstwa Scotta Meyersa] (http://www.amazon.com/More-Effective-Improve-Programs-ebook/dp/B004VSMDNY/ref=la_B004BBEYYW_1_2?s=books&ie= UTF8 i qid = 1381129998 & sr = 1-2) do obszernej dyskusji na ten temat, w tym zaskakujących pułapek (związanych z konwersjami zdefiniowanymi przez użytkownika), które klasy proxy mogą ci dać. Ten materiał to [obowiązkowe czytanie] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – TemplateRex