7

次のコードがあるとします。

template <typename T>
struct Wrapper {
    T value;
    Wrapper(T val) : value(val) {}
}

int main() {
    Wrapper<int> x(42);
    int y = x; // need solution for y = x.value
    return 0;
 }

割り当てを実装する方法はありますか

int y = x;

y = x.value を意味します。

代入演算子自体のオーバーロードは、代入の左側のオブジェクトに適用され、2 つの引数を持つフレンド関数は標準で許可されていないため、不可能であることはわかっています。

他の演算子をオーバーロードしたり、いくつかの特別なトリックを使用したりすることによってこれが不可能な場合、次のように Wrapper クラスによって提供される get メソッドを呼び出す以外に、どのようにこれを実装しますか?

int y = x.get();
4

1 に答える 1

7

への暗黙的な変換を提供しないのはなぜですかT

operator T() { return value; } 

これにより、コンパイラが割り当ての右側を に変換しようとするため、割り当てが機能しTます。暗黙の変換により、それが成功します

これにより、割り当て以外の他の変換が機能することに注意してください。たとえば、Wrapper<T>インスタンスをTパラメーターとして渡すことが可能になります。特定のシナリオでは機能する場合と機能しない場合があります

于 2013-08-12T20:42:23.060 に答える