С++: удобный способ доступа к оператору [] из класса?

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

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


person A. Rex    schedule 03.03.2009    source источник


Ответы (6)


(*this)[bar];

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

person Evan Teran    schedule 03.03.2009

Использовать

(*this)[bar]

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

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

person Mr Fooz    schedule 03.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)

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

person Robert Gould    schedule 03.03.2009
comment
В каком-то смысле мне это нравится, потому что в последние несколько минут я устанавливал self = *this, а затем использовал self. Спасибо. - person A. Rex; 03.03.2009
comment
Vector наоборот, потому что vector::at() должен выполнять проверку диапазона перед вызовом operator[]() - person MSalters; 03.03.2009
comment
Предостережение относительно версии Widget& self: если вы все еще хотите иметь возможность копировать свой класс, использовать operator= и т. д., вам придется написать много дополнительных новых шаблонов. - person Nathan Pierson; 08.04.2021

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

person Michael Kristofik    schedule 03.03.2009

 operator[](bar) 

Это тоже должно работать. Меня устраивает!

person user3199814    schedule 15.01.2014
comment
В моем вопросе это самый первый вариант, который я упоминаю. - person A. Rex; 19.01.2014

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

person Drew Hall    schedule 03.03.2009