Перегрузка оператора = () с обратным вызовом

У меня есть шаблон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 базовым типом или нет (что здесь не делается), но это не относится к моему вопросу.

Ответы на вопрос(1)

Ваш ответ на вопрос