2010-04-04 3 views
-1

Supposons que j'ai:C++ raccourci operator- opérateur>()

Foo foo; 

est là un raccourci pour cela?

foo.operator->().operator()(1, 2); 
+4

:: visage palm :: ** Non. ** :: secoue la tête dans l'incrédulité défait :: – dmckee

+0

J'ai édité votre question. C'est ce que vous vouliez dire? – Potatoswatter

+3

@dmckee: Hé, sois gentil. – jalf

Répondre

3

En supposant que vous avez réellement signifiaitfoo.operator->().operator()(1, 2), et que vous avez le contrôle sur la classe Foo, une forme plus simple serait (*foo)(1, 2). Il faut le operator* à celui défini cependant, mais puisque nous attendons généralement foo->bar être équivalent à (*foo).bar, il semble raisonnable.

Si votre Foo est une classe de pointeur intelligent de quelque sorte, qui pointe vers un objet qui définit un operator(), ce serait la manière la plus concise d'appeler operator() de l'objet.

Mais sans plus de détails (et sans que vous fournissiez une expression qui soit en réalité C++ valide - il n'y a aucun moyen pour que operator(1, 2) comme vous l'avez écrit puisse être valide), il est impossible de répondre à votre question. Je devine juste ce que vous essayez de faire.

6

Bien ... Oui. La forme plus courte regarderait comme

foo.operator->()(1, 2) 

En ce qui concerne l'élimination de la partie operator -> ... D'après les informations que vous avez fournies jusqu'à présent, il est impossible de dire, mais si elle est mise en œuvre de la façon dont je devine qu'il est mis en œuvre (à en juger par votre expression), vous ne pouvez pas l'éliminer. En C++, l'utilisation d'un opérateur surchargé -> dans une expression est interprétée comme une chaîne d'appels -> surchargés répétitifs, qui se termine par un appel -> intégré. Cela signifie qu'à un moment donné, le -> surchargé doit renvoyer un pointeur. Votre surchargé -> ne renvoie évidemment pas de pointeur. Donc, pour l'utiliser, vous n'avez pas d'autre choix que de l'épeler explicitement comme operator ->().

+0

+1 pour spécifier correctement ce qui est nécessaire pour utiliser 'operator->'. Je ne me suis pas rendu compte qu'un programme compatible pouvait utiliser 'non-pointer' operator- >', mais c'est possible! – Potatoswatter

0

Eh bien, non, mais, en supposant que vous disposez des droits d'écriture à la classe, vous pouvez définir une autre fonction membre qui appelle l'opérateur(), et vous auriez quelque chose comme:

foo->myfunc(1,2); 

que vous trouvez vous-même dans cette position est un signe que vous (ou la personne qui a écrit cette classe) est un peu trop mignon avec la surcharge de l'opérateur.

+0

Err ... Non. Ça ne marchera pas. La surcharge de l'OP '->' renvoie un non-pointeur. Cela signifie immédiatement que toute tentative de l'appeler «foo -> ...» est mal formée. Il ne compilera tout simplement pas. (Il y a une chance pour que cela fonctionne si le '->' surchargé retourne quelque chose qui à son tour a son propre '->' surchargé, mais ce serait trop long de faire une telle supposition sans aucune information supplémentaire. – AnT

+0

Je vois que - f.operator ->(). MyFunc (1,2) fonctionne. Je pense que cela souligne le fait que cela semble être une mauvaise utilisation de la surcharge de l'opérateur. – JohnMcG

Questions connexes