【发布时间】:2010-10-13 08:44:50
【问题描述】:
让我说我们有一个简单的编程任务。但为了清楚起见,我从几个代码示例开始。 首先,我们编写了某种数据容器类,但出于任务的目的,无论该类是什么。我们只需要它的行为是正确的。
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-> ()视为最佳选择。 - 否则,如果我们试图以相同的方式调用底层类的 const 成员函数 (
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 编译器使标准输出在每次调用时都向我们发出警告。
我理解这样的语义假设c 同时表现为 const 和 non-const。但好奇仍在我的脑海中。
【问题讨论】:
标签: c++ design-patterns templates