私は異常な状況にあり、
次のようなクラスがあるとします。
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_;
};
クライアントが member にフル アクセスできるように設計されたクラスは、が参照を返すvalue_ように、参照を返すことでクライアントにフル アクセスを与える必要があります。セッター/ゲッターのペアではうまくいきません。std::vectoroperator[]
ただし、 とは異なり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_Tvalue_
ただし、Tコピー不可にする必要はありません。クラスCはコピーできるからです。問題の核心は、クラスCに見られるようにC、いくつかのメンバーがあり、それらはすべてsizeプロパティを持ち、構築されると、それらはすべて同じで構築され、代入によって置き換えることが許可されているsize場合、メンバーが同じプロパティvalue_を持たなくなる可能性があるという意味で、データ構造が破損しています。size
サイズTが同じ場合にのみコピーまたは割り当てを許可することもオプションではありません。オブジェクトをコピーすると、コピーC元とコピー先でサイズが異なる可能性があるためです。例えば、
C c1(10);
C c2(20);
c1 = c2;
完全に合理的です。のサイズc1が変更されますが、そのメンバーもすべて同じ新しいサイズに変更されるので、問題ありません。
問題を明確に述べたことを願っています。要約すると、基本的に必要なコンストラクターを持つ任意の型にすることができCますT。コピーして割り当てることができます。クライアントに実行してほしくない唯一のことは、throughへの代入です。TTvalue_C::value()