2

背景

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

4

0 回答 0