私が持っているとしましょう:
Foo foo;
これの省略形はありますか?
foo.operator->().operator()(1, 2);
はい、そうです。短い形式は次のようになります
foo.operator->()(1, 2)
部分を削除することに関してはoperator ->
...これまでに提供した情報からは言うことはできませんが、私が推測できる方法で実装されている場合(表現から判断して)、それを削除することはできません。
C ++では->
、式でのオーバーロードされた演算子の使用は、オーバーロードされた呼び出しの繰り返しのチェーンとして解釈され、->
最終的には組み込みの->
呼び出しで終了します。これは、ある時点でオーバーロードされたもの->
がポインタを返さなければならないことを意味します。オーバーロード->
されたものは明らかにポインタを返しません。したがって、それを使用するには、明示的にとして綴る以外に選択肢はありませんoperator ->()
。
あなたが実際にを意味し foo.operator->().operator()(1, 2)
、あなたがクラスを制御できると仮定するとFoo
、より単純な形式はになります(*foo)(1, 2)
。それはoperator*
定義されたものを必要としますが、私たちは通常、foo->bar
と同等であると期待しているので(*foo).bar
、それは合理的であるように思われます。
Foo
を定義するオブジェクトを指す、ある種のスマートポインタクラスである場合、operator()
これはオブジェクトのを呼び出す最も簡潔な方法になりますoperator()
。
しかし、詳細がなければ(そして、実際に有効なC ++である式を提供しなければ、operator(1, 2)
あなたが書いたようにそれが有効になる方法はありません)、あなたの質問に答えることは不可能です。私はあなたが何をしようとしているのかを推測しているだけです。
いいえ。ただし、クラスへの書き込み権限があると仮定すると、operator()を呼び出す別のメンバー関数を定義すると、次のようになります。
foo->myfunc(1,2);
あなたがこの位置にいることに気付いたということは、あなた(またはこのクラスを書いた人)が演算子のオーバーロードで少し可愛すぎることを示しています。