デストラクタがスローできることを除いて、私には問題ないように見えますが、これは悪いことです。swap
割り当ての代わりに元の値を使用します(編集:これは を扱いますがstd::string
、 よりもユーザーフレンドリーではないクラスで発生する可能性のある問題についてはコメントを参照してくださいstring
)。
コードのこの部分から少し離れれば、おそらく、一時的な値をまったく設定する必要がない方法を見つけることができます。オブジェクトの可変状態の共有は、可変グローバルが悪いのと同じ理由で悪い場合がありますが、プログラム全体を台無しにするのではなく、クラスを台無しにするだけなので、程度は低くなります。
たとえば、オブジェクト全体をコピーし、変数に新しい値を設定して、自分自身にアクセスする代わりにコピーにアクセスすることができます。明らかに、それが必ずしも可能または効率的であるとは限りません。ケースバイケースで代替案を探す必要があります。おそらく、コピーは、子に関する限り (つまり、同じ子オブジェクトを参照する) 浅くすることができます。
使用法に関しては、次のようなタイプを推測できます (テストされていないコード):
template <typename T, typename ARG>
TemporaryAssignment<T> temp_value(T &var, ARG &&newvalue) {
return TemporaryAssignment(var, std::forward<ARG>(newValue));
}
使用法:
auto t = temp_value(myVariable, myTemporaryValue);
次に、TemporaryAssignment の移動コンストラクターが必要です。
template <typename TYPE> class TemporaryAssignment {
// change data member
TYPE *mVariable;
TYPE mOriginalValue;
public:
TemporaryAssignment(TYPE &inVariable, TYPE inValue)
: mVariable(&inVariable), mOriginalValue(std::move(inVariable)) {
*mVariable = std::move(inValue);
}
TemporaryAssignment(TemporaryAssignment &&rhs) {
mOriginalValue = std::move(rhs.mOriginalValue);
mVariable = rhs.mVariable;
rhs.mVariable = 0;
}
~TypeAssignment() {
using std::swap;
if (mVariable) {
swap(*mVariable, mOriginalValue);
}
}
// can't remember whether this is needed
TemporaryAssignment(const TemporaryAssignment &) = delete;
TemporaryAssignment &operator=(const TemporaryAssignment &) = delete;
TemporaryAssignment &operator=(TemporaryAssignment &&) = delete;
};
使い方が代入に見えるようにoperator=
forを指定しようとちょっと考えたのですが、うまくいきませんでした。TemporaryAssignment
auto t = (temporary(myVariable) = myTemporaryValue);
もっともらしいですが、次の意味があるため、おそらく定義したくないでしょうTemporaryAssignment
。operator=
t = otherTemporaryValue;
必ずしも明確ではなく、おそらく許可されるべきではありません。から返される 2 番目のクラスを使用して、その からtemporary
返される可能性があります。TemporaryAssignment
operator=