Ответ 1
(*this)[bar];
отлично работает для меня.
У меня есть класс С++, который перегружает operator[]
, оператор индексов/скобок массива. Это ужасно удобно за пределами моего класса, где я могу написать foo[bar
]. Однако я не могу понять, как использовать эту нотацию, когда я реализую методы внутри своего класса.
Я знаю, что могу писать operator[](bar)
или this->operator[](bar)
, но они довольно громоздки и, в первую очередь, отнимают много удобства оператора. (Я также знаю, что могу просто добавить новый метод, который вызывает оператор.) Есть ли способ написать this[bar]
или this->[bar]
или что-то подобное приятное?
Примечание. Этот вопрос может также применяться ко многим унарным операциям (например, как я могу называть foo++
из класса?), но лично я забочусь только о operator[]
.
Изменить: я понял сразу после публикации, что могу использовать (*this)[bar]
. Все ответы до сих пор также предлагали это. Существуют ли другие альтернативы?
(*this)[bar];
отлично работает для меня.
Используйте
(*this)[bar]
чтобы вызвать 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)
На самом деле я думаю, что большинство ручек реализованы в API Apple NS...
Вы можете использовать (* this) [bar], но это может не быть большим улучшением...
operator[](bar)
Это тоже должно работать. Это работает для меня!