C++:Удобный способ получить доступ к operator[] из класса?
-
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)
Это тоже должно сработать.У меня это работает!