Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

(*this)[bar];

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

Ответ 2

Используйте

(*this)[bar]

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

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

Ответ 3

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

Ответ 4

Я использую функцию at(), и оператор [] вызывает функцию at() за кулисами, поэтому operator [] является просто синтаксическим сахаром. То, что делает 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)

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

Ответ 5

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

Ответ 6

 operator[](bar) 

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