Как мне написать разные операторы [] для LValue и RValue?

Я пытаюсь связать библиотеку C с моим проектом C++. Библиотека имеет свой собственный векторный тип, предположим, что это VECTOR, и она обеспечивает доступ к элементам:

int vector_set_value(VECTOR* vec, int index, double new_value);
int vector_get_value(VECTOR* vec, int index, double* retrieved_value);

Теперь было бы неплохо обернуть операции get и set перегрузкой operator[]

double& operator[](int index);
const double& operator[](int index) const;

Но как мне указать, что оператор [] имеет разное поведение между vec[index]=3 и double value=vec[3]? Для предыдущего следует вызвать vector_set_value, а для последнего следует вызвать vector_get_value.


person xis    schedule 14.08.2013    source источник
comment
Я знаю, что в Ruby есть def [] и def []=, есть ли аналогичная стратегия в C++?   -  person xis    schedule 15.08.2013
comment
используйте 1_ ?   -  person stijn    schedule 15.08.2013
comment
Взгляните на подписи для std::vector operator[]   -  person Praetorian    schedule 15.08.2013
comment


Ответы (1)


Я бы не стал пытаться обернуть один интерфейс в другой.

При этом, если вы действительно хотите сделать это, одним из возможных решений является создание прокси-объекта, и ваш operator[] возвращает этот прокси-объект. Прокси-объект будет иметь преобразования в базовый тип const double& для чтения и перегруженный operator= для записи. Каждый из них будет вызывать соответствующую библиотечную функцию.

Это позволит использовать синтаксис, выглядящий как синтаксис C++ std::vector: MyVector v(...); v[1] = 10.1; double d = v[1];, но будет проблематичным. Прокси-объект не может заменить реальный тип во всех контекстах, только в некоторых из них. И даже там семантика другая, поэтому, хотя это может выглядеть как обычный вектор, однажды вы попытаетесь использовать прокси так, как он не поддерживает, и будете озадачены утечка абстракции

person David Rodríguez - dribeas    schedule 14.08.2013
comment
В частности, вы не сможете передать vec[3] функции, ожидающей аргумент double &, потому что фундаментальная проблема заключается в том, что интерфейс получения-установки несовместим со ссылками. - person Potatoswatter; 15.08.2013
comment
Я тоже это понял, потому что не мог получить адрес переменной double с помощью этого дурацкого интерфейса. В любом случае, благодарю Вас! - person xis; 16.08.2013