非const参照がラッパーテンプレートのコピーコンストラクターのconst参照に変換されるようにするにはどうすればよいですか?私のコピーコンストラクタは論理的な移動コンストラクタ(pre-C++ 11より前)であることに注意してください。init
のメンバーは現在どのラッパーが有効かを追跡します。非constがラッパーテンプレートのconstに変換できるようにする
template<typename T>
class wrap
{
T & object;
bool init;
public:
wrap(T& object) : object(object), init(true) { }
//attempt which fails since "init" is private in other type
template<typename O>
wrap(wrap<O> const & o)
: object(o.object)
, init(true)
{
const_cast<wrap<O>&>(o).init = false;
}
};
その後、アクセスルールは、プライベートinit
変数へのアクセスを許可するので、他のタイプは、まったく同じである場合、これは正常に動作します。基本的には、次のように動作するはずです:
//adding const
wrap<Type> a(get());
wrap<Type const> b = a;
//base type would also be nice
wrap<BaseType> c = a;
"他のタイプがまったく同じ場合、実際にはそうではありません。それはテンプレートではなく暗黙のコピーコンストラクタを使用するので、両方とも 'init' setで終わるでしょう。 –