背景
我正在研究 C++11 JSON 映射类,以引入语法直观且安全的对象,这些对象可以将自身序列化/反序列化为 JSON 表示。
问题
我需要为算术类型(主要是int
, unsigned
, float
, double
)提供一个好的代理。如何实施这样的事情?第一个想法是实现模板类重载所有算术、位和比较运算符。但是为了避免不必要的工作,我应该写什么超载?那么演员表操作员呢?返回类型应该是什么operator+
?
简单的不完整实现展示了这个想法:
template <typename T>
class Proxy {
T mValue;
public:
Proxy(T value = T()) : mValue(value){}
//Should it be defined like this...
Proxy &operator+=(T value) {
mValue += value;
return *this;
}
//Or maybe like this...
template <typename U>
Proxy &operator+=(U &&value) {
mValue += std::forward<U>(value);
return *this;
}
//Should this return T or Proxy<T>?
T operator+(T value) {
return mValue + value;
}
//Is it necessary?
operator T() const {
return mValue;
}
//...
};
选择
但是我应该将原始 JSON 字段实现为代理类吗?也许有更好的方法。例如,我还考虑将内部值公开,所以不要写:
json.intField += 4;
用户必须写
json.intField.value += 4;
这种语法不像我希望的那样直观和清晰,但这也是一种选择。
对于每个告诉我如何在 C++ 中实现 JSON 的人——这不是我的问题!代理模式有更广泛的用途!