Позвольте мне сказать, что у нас есть простая задача программирования. Но для ясности я начну с нескольких примеров кода.
Прежде всего, мы написали некоторый класс контейнера данных, но для целей задачи, независимо от того, что это за класс. Нам просто нужно, чтобы он вел себя правильно-константно.
class DataComponent {
public:
const std::string& getCaption() const {
return caption;
}
void setCaption(const std::string& s) {
caption = s;
}
private:
std::string caption;
};
Тогда давайте предположим, что у нас есть универсальный класс, который ведет себя как фасад над произвольным инкапсулированным экземпляром класса. Скажем, мы перегружены оператором доступа участника (->
).
template <typename T> class Component {
public:
Component() { instance = new T(); }
...
const T* operator-> () const {
return instance;
}
T* operator-> () {
// but there might be additional magic
return instance;
}
private:
T *instance;
};
В этот момент я должен сказать, как я хочу, чтобы это работало:
- если мы вызываем неконстантные функции-члены базового класса через оператор доступа к члену (
component->setCaption("foo")
), компилятор рассматривает неконстантные T* operator-> ()
как лучший выбор.
- в противном случае, если мы пытаемся вызывать константные функции-члены базового класса таким же образом (
component->getCaption()
), компиляторы выбирают const T* operator-> () const
с другой стороны.
Этот пример кода выше не будет работать таким образом, поэтому мне интересно, есть ли возможность дать компилятору такое поведение, о котором я упоминал. Любые предложения.
РЕДАКТИРОВАТЬ: Пусть наш оператор доступа члена перегружен таким образом:
const T* operator-> () const { return instance; }
T* operator-> () {
cout << "something going change" << endl;
return instance;
}
И давайте где-нибудь переменную Component<DataComponent> c
. Затем при вызове c->getCaption()
stdout следует хранить молчание, но при вызове c->setCaption("foo")
stdout должен предупредить нас о том, что что-то изменится. VS 2010 compilier заставляет stdout предупреждать нас о каждом из этих вызовов.
Я понимаю, что такая семантика предполагает, что c
ведет себя как const и не-const одновременно. Но любопытство все еще в моей голове.