2013-05-23 1 views
5

Я могу перегрузить оператор скобки, используя следующую подпись:Вызов скобку перегрузка дается указатель

char& operator()(const int r, const int c); 

Предполагаемое использование этого было бы:

// myObj is an object of type MyClass 
myObj(2,3) = 'X' 
char Y = myObj(2,3); 

Который работает, как я ожидал. Однако использование оператора скобки при работе с указателем становится запутанным. Я хотел бы сделать:

// pMyObj is a pointer to an object of type MyClass 
pMyObj->(2,3) = 'X'; 
char Y = pMyObj->(2,3); 

Однако такой синтаксис дает ошибку Error: expected a member name (в VisualStudio, по крайней мере).

Следующие действия работают, но кажутся мне запутанными с разыменованием и более круглыми скобками, чем аргументы.

char X = (*pMyObj)(2,3); 

Есть ли способ использовать оператор -> вызвать перегрузку ()?

+2

'pMyObj-> operator() (2,3)' – juanchopanza

+0

Вы уверены, что не можете устранить указатель? Если нет, вам нужно будет выбрать меньшее из двух зол. – chris

ответ

8

Да есть, но не нравится:

pMyObj->operator()(2,3); 
+0

Thankyou! Я попробовал 'pMyObj-> operator (2,3)', но это не сработало. Думаю, его отвратительно, что бы вы ни делали, но я думаю, что я предпочитаю это! – chessofnerd

+2

@chessofred Ну, на самом деле есть другой способ: не перегружать operator() и вместо этого использовать функцию с читаемым именем: например, 'pMyObj-> itemAt (2,3)' – Luis

+0

Ничего себе, это был очень полезный вопрос для я столкнулся с проблемой создания указателя на функцию-член 'operator()' 'std :: uniform_int_distribution'. Теперь я могу использовать указатель класса и использовать эту функцию, но как создать прямой указатель на функцию-член? Для меня, похоже, не работает: 'int (std :: uniform_int_distribution :: * myFunc) (std :: mt19937_64) = & std :: uniform_int_distribution :: operator' – Sudarsan

0

если вы делаете, как показано ниже

#define SUB operator() 

Тогда вы можете написать что-то вроде этого ...

pMyObj->SUB(2,3) 

не такой элегантный, как Fortran ;-) но, возможно, не слишком уродливый для фактического использования