C++:Удобный способ получить доступ к operator[] из класса?

StackOverflow https://stackoverflow.com/questions/605037

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

(*this)[bar];

у меня это прекрасно работает.

Другие советы

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

Я использую функцию 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)

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

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

(*this)[bar]

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

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

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

 operator[](bar) 

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top