C ++中基本类型的单一赋值

时间:2010-09-21 21:20:04

标签: c++

我想为基本类型(例如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。如何解决这个问题?

1 个答案:

答案 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;
}