我有一个不寻常的情况,
假设我有一个像下面这样的课程,
template <typename T>
class C
{
public :
C (int size) : value_(size), some_other_member_(size) {}
T &value () {return value_;}
const T &value() const {return value_;}
private :
T value_;
SomeOtherType some_other_member_;
};
该类设计为客户端可以对成员具有完全访问权限value_
,就像std::vector
'soperator[]
将返回一个引用一样,该类也必须通过返回一个引用来授予客户端完全访问权限。一个 setter/getter 对是不行的。
但是,与 不同std::vector
的是,我不想让客户能够完全替换该成员。即客户端可以调用const
或非const
成员value_
,但不允许进行以下操作,
C<SomeType> c(10);
SomeType another_value(5);
c.value() = another_value; // This shall not be allowed
有什么可能的方法可以让客户完全访问value_
. 从某种意义上说,类C
应该像一个容器,但是一旦它包含的东西被初始化(通过构造函数,对 有要求T
,但这里不相关),客户端只能value_
通过T
的成员函数修改,不能替换value_
通过分配。
但是,要求T
不可复制对我来说不是一个选择。因为类C
可以复制。问题的核心,是在类中看到的C
,C
有几个成员,他们都有一个size
属性,在构造的时候,它们都构造了相同的size
,如果value_
允许通过赋值替换,那么它允许数据结构被破坏,因为成员可能不再具有相同的size
属性。
要求T
仅在大小相同时允许复制或分配也不是一种选择。因为,在复制C
对象时,源和目标之间的大小可能不同。例如,
C c1(10);
C c2(20);
c1 = c2;
完全合理。的大小c1
变了,但它的所有成员也都改成了同样的新大小,所以没关系。
我希望我已经把问题说清楚了。我总结一下,我希望C
对 没有太多限制T
,T
基本上可以是任何类型,带有所需的构造函数。T
可以复制和分配。我不希望客户做的唯一事情是分配到value_
through C::value()
。