Background
I'm working on C++11 JSON mapping classes to introduce syntactically intuitive and safe objects which can serialize/deserialize itself into JSON representation.
The Question
I need to provide a good proxy for arithmetic types (mainly for int, unsigned, float, double). How to implement such thing? The first idea is to implement template class overloading all arithmetic, bitwise and comparison operators. But what overload should I write in order to avoid unnecessary work? What about cast operators? What should be return type of operator+?
Simple incomplete implementation showing the idea:
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;
}
//...
};
Alternative
But should I implement the primitive JSON fields as a proxy classes? Maybe there's a better way. For instance, I also consider making the internal value public, so instead of writing:
json.intField += 4;
the user would have to write
json.intField.value += 4;
This syntax is not as intiutive and clear as I would like it to be, but that's also an option.
For everyone telling me how to implement JSON in C++ - that's not my question! Proxy pattern has wider usage!