Фон
Я работаю над классами отображения JSON в C ++ 11, чтобы представить синтаксически интуитивно понятные и безопасные объекты, которые могут сериализоваться / десериализоваться в представление 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;
Этот синтаксис не настолько интуитивен и понятен, как хотелось бы, но это тоже вариант.
Для всех, кто говорит мне, как реализовать JSON в C ++ — это не мой вопрос! Прокси-шаблон имеет более широкое использование!
Задача ещё не решена.
Других решений пока нет …