Перегрузка оператора = () с обратным вызовом
У меня есть шаблонProperty
который упаковывает данные и предоставляет другие услуги. Этот шаблон специализирован для базовых данных (float, int_32, bool ...) и существует другая спецификация для векторов базовых типов. Что-то вроде:
template<typename T>
Property : public PropertyBase
{
public:
// Base types specilization.
void operator=(T const & data);
}
template<typename T>
Property<std::vector<T> > : public PropertyBase
{
public:
// Specilization for vectors of base types.
T const & operator[](std::size_t i) const;
}
На спецификации для исходных данных я перегруженoperator=
так что обратный вызов вызывается после изменения данных. На спецификации для векторов я перегруженoperator[]
получить индексированный доступ к i-му элементу вектора.
Теперь я хотел бы получить подобное поведение, которое я имею дляoperator=
на основных типах, но с моей специализацией для векторов. Я застрял, хотя. То, что я хотел бы сделать, это что-то вроде:
Property<std::vector<float> > myProp;
myProp[5] = 5.21f;
и ожидаем, что обратный вызов будет вызван после того, как произошло присвоение.
Проблема в том, чтоmyProp[5]
возвращает float, и механизм обратного вызова не определяется для float, а Property.
Конечно, я могу написать функцию индексированного установщика, такую как
template<typename T>
Property<std::vector<T> > : public PropertyBase
{
public:
// Specilization for vectors of base types.
T const & operator[](std::size_t i) const;
void set(int i, T const & newValue);
}
Но с сеттером синтаксис не так чист, как я ожидал.
Я также могу позвонить вoperator[]
но затем обратный вызов вызывается до назначения, а не после.
У кого-нибудь есть идея получить этот чистый синтаксис, и в то же время иметь возможность вызывать мой обратный вызов после присвоения?
Спасибо!
PS: обратите внимание, что мойProperty
шаблоны более сложны, чем написанные, и проверяют, является ли T базовым типом или нет (что здесь не делается), но это не относится к моему вопросу.