背景
我正在使用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 - 这不是我的问题!代理模式有更广泛的用途!