对我来说看起来不错,除了析构函数可以抛出,这很糟糕。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=
forTemporaryAssignment
以使用法看起来像一个作业,但我没有想出任何好的东西。
auto t = (temporary(myVariable) = myTemporaryValue);
TemporaryAssignment
是合理的,但您可能不想operator=
定义,因为以下含义:
t = otherTemporaryValue;
不一定清楚,可能不应该被允许。也许有第二个类要从返回temporary
,并且TemporaryAssignment
从它返回operator=
。