我想为基本类型(例如int)创建一个“单一赋值”包装器,它像int一样说话,像int一样走路,闻起来像int,但只能被修改或分配给最多一次(就像在一些纯函数式语言中)。例如(省略复制构造函数以保持示例简单):
template<class T>
struct SA {
SA<T>(T init) : wasAssigned(false) {
val = tmp = init;
}
SA<T> & operator=(const T& other) {
if (!wasAssigned) {
if (val != tmp) {
val = tmp;
} else {
val = tmp = other;
}
wasAssigned = true;
}
return *this;
}
operator T& () {
if (!wasAssigned && (val != tmp)) {
wasAssigned = true;
val = tmp;
} else {
tmp = val;
}
return tmp;
}
private:
bool wasAssigned;
T val, tmp;
};
这很接近,但并不完美。它依赖于val / tmp相等性测试来检测更改,并在这种情况下失败:
SA<int> i(3);
cin >> i;
i = 5;
如果cin >> i
分配的值与初始值(3)相同,那么最后我将为5。如何解决这个问题?
答案 0 :(得分:2)
以下内容可能会起作用,尽管我对这些副作用并不是100%肯定。基本上返回对tmp
的引用,除了第一次调用获取非const引用外,还有const
方法进行只读访问。
operator T& () {
if (wasAssigned) {
tmp = val;
return tmp;
} else {
wasAssigned = true;
return val;
}
}
operator const T& () const {
return val;
}
operator T () const {
return val;
}