C ++: удобный способ доступа к operator [] из класса? - PullRequest
35 голосов
/ 03 марта 2009

У меня есть класс C ++, который перегружает operator[], оператор индекса / скобок массива. Это очень удобно вне моего класса, где я могу написать foo[bar]. Однако я не могу понять, как использовать эту нотацию, когда я реализую методы внутри моего класса.

Я знаю, что могу написать operator[](bar) или this->operator[](bar), но это довольно громоздко и в первую очередь лишает оператора удобства. (Я также знаю, что могу просто добавить новый метод, который вызывает оператор.) Есть ли способ, которым я могу написать this[bar] или this->[bar] или что-то похожее хорошее?

Примечание : Этот вопрос может также относиться ко многим унарным операторам (например, как я могу позвонить foo++ из класса?), Но лично меня волнует operator[].

Редактировать : вскоре после публикации я понял, что могу использовать (*this)[bar]. Все ответы до сих пор предлагали это также. Есть ли другие альтернативы?

Ответы [ 6 ]

53 голосов
/ 03 марта 2009
(*this)[bar];

отлично работает у меня.

3 голосов
/ 03 марта 2009

Я использую функцию at () и заставляю оператора [] вызывать функцию at () за кулисами, поэтому оператор [] - это просто синтаксический сахар. Вот как это делает std :: vector, поэтому это кажется разумным (с приоритетом) способом сделать это.

Теперь для полного синтаксического взлома сахара (не могу сказать, что я полностью рекомендую это, но могло бы поразить ваше воображение):

class Widget
{
    Widget&     self;
public:
    Widget() :self(*this)
    {}

    void operator[](int)
    {
        printf("hello");
    }

    void test()
    {
        //scripting like sugar
        //you pay the price of an extra reference per class though
        self[1]; 
    }
};


int main(int argc, char* argv[])
{
    Widget w;
    w[1];
    w.test();
    return 0;
}

Также, если вы хотите сделать это бесплатно, не оплачивая стоимость ссылки, И являются последователями какой-то злой секты, посвященной тому, что программисты могут пострадать, которую вы могли бы сделать:

#define self (*this)

На самом деле, я думаю, именно так большинство дескрипторов реализовано в NS API Apple ...

3 голосов
/ 03 марта 2009

Альтернативой (*this)[bar] является использование именованной функции-члена, которая выполняет работу operator[]. Перегруженные операторы облегчают работу ваших пользователей. Что еще более важно, они являются частью интерфейса вашего класса . Спросите себя, действительно ли имеет смысл реализовать ваш класс с точки зрения его собственного открытого интерфейса. Если нет, я предлагаю написать отдельную (защищенную или приватную) функцию-член для выполнения работы, а затем вызвать operator[] и любую другую функцию, вызывающую ее.

3 голосов
/ 03 марта 2009

Использование

(*this)[bar]

для вызова operator[] объекта экземпляра.

this[bar] обрабатывает указатель this как массив и индексирует bar -й элемент этого массива (возвращая, вероятно, недопустимую ссылку на объект).

1 голос
/ 15 января 2014
 operator[](bar) 

Это тоже должно работать. У меня это работает!

1 голос
/ 03 марта 2009

Вы можете использовать (* this) [bar] , но это не может быть большим улучшением ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...