2013-05-23 12 views
5

posso sovraccaricare l'operatore parentesi con la seguente firma:Chiamando la parentesi di sovraccarico dato un puntatore

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

L'utilizzo previsto per questo sarebbe:

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

che funziona come mi aspetto. Tuttavia, l'utilizzo dell'operatore parentesi quando si ha a che fare con un puntatore diventa contorto. Vorrei fare:

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

Tuttavia, tale sintassi cede l'errore Error: expected a member name (in VisualStudio almeno).

Quanto segue funziona ma mi sembra complicato con un dereferenziamento e più parentesi che argomenti.

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

C'è un modo per utilizzare l'operatore -> di chiamare il () sovraccarico?

+2

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

+0

Sei sicuro di non poter eliminare il puntatore? Altrimenti, dovrai scegliere il minore di due mali. – chris

risposta

8

Sì, c'è, ma non sarà simile al primo:

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

Grazie! Avevo provato l'operatore 'pMyObj-> (2,3)' ma non funzionava. Immagino che sia disgustoso, non importa quello che fai ma penso di preferirlo! – chessofnerd

+2

@chessofred Beh, in realtà c'è un altro modo: non sovraccaricare l'operatore() e invece utilizzare una funzione con un nome leggibile: ad esempio, 'pMyObj-> itemAt (2,3)' – Luis

+0

Wow questa era una domanda molto utile per io che stavo affrontando un problema con la creazione di un puntatore alla funzione membro 'operator()' di 'std :: uniform_int_distribution'. Ora posso usare un puntatore di classe e usare la funzione, ma come si crea direttamente un puntatore alla funzione membro? Quanto segue non sembra funzionare per me: 'int (std :: uniform_int_distribution :: * myFunc) (std :: mt19937_64) = & std :: uniform_int_distribution :: operator' – Sudarsan

0

se lo si fa, come di seguito

#define SUB operator() 

Poi si può scrivere cose come questa ...

pMyObj->SUB(2,3) 

non elegante come Fortran ;-) ma forse non troppo brutto per l'uso effettivo