2013-05-23 13 views
5

mogę przeciążać operatora nawias stosując następujący podpis:Wywołanie nawias przeciążenie podany wskaźnik

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

Zamierzone wykorzystanie byłoby:

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

Który działa jak oczekuję. Jednak użycie operatora nawiasu przy pracy ze wskaźnikiem staje się zawiłe. Chciałbym zrobić:

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

Jednakże taka składnia daje błąd Error: expected a member name (w VisualStudio przynajmniej).

Poniższe działa, ale wydaje mi się zawiłe z dereferencją i więcej nawiasów niż argumenty.

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

Czy istnieje sposób, aby użyć operatora -> wywołać przeciążenie ()?

+2

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

+0

Czy na pewno nie można wyeliminować wskaźnika? Jeśli nie, musisz wybrać mniejsze zło. – chris

Odpowiedz

8

Tak tam jest, ale nie lubię go:

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

Dziękuję! Próbowałem 'pMyObj-> operator (2,3)' ale to nie działało. Myślę, że to obrzydliwe bez względu na to, co robisz, ale myślę, że wolę to! – chessofnerd

+2

@chessofred Cóż, tak naprawdę jest inny sposób: nie przeciążaj operatora() i zamiast tego użyj funkcji o czytelnej nazwie: na przykład 'pMyObj-> itemAt (2,3)' – Luis

+0

Wow, to było bardzo przydatne pytanie dla ja, który miał problem z utworzeniem wskaźnika do funkcji składowej 'operator()' z 'std :: uniform_int_distribution'. Mogę teraz użyć wskaźnika klasy i użyć funkcji, ale jak utworzyć wskaźnik bezpośrednio do funkcji elementu? Poniższe nie wydaje się działać dla mnie: 'int (std :: uniform_int_distribution :: * myFunc) (std :: mt19937_64) = & std :: uniform_int_distribution :: operator' – Sudarsan

0

jeśli tak jak poniżej

#define SUB operator() 

Następnie można pisać takie rzeczy ...

pMyObj->SUB(2,3) 

nie tak elegancki jak Fortran ;-), ale może nie za brzydki do rzeczywistego użytku