-1

私が持っているとしましょう:

Foo foo;

これの省略形はありますか?

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

3 に答える 3

6

はい、そうです。短い形式は次のようになります

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

部分を削除することに関してはoperator ->...これまでに提供した情報からは言うことはできませんが、私が推測できる方法で実装されている場合(表現から判断して)、それを削除することはできません。

C ++では->、式でのオーバーロードされた演算子の使用は、オーバーロードされた呼び出しの繰り返しのチェーンとして解釈され、->最終的には組み込みの->呼び出しで終了します。これは、ある時点でオーバーロードされたもの->がポインタを返さなければならないことを意味します。オーバーロード->されたものは明らかにポインタを返しません。したがって、それを使用するには、明示的にとして綴る以外に選択肢はありませんoperator ->()

于 2010-04-04T00:37:39.823 に答える
3

あなたが実際にを意味し foo.operator->().operator()(1, 2)、あなたがクラスを制御できると仮定するとFoo、より単純な形式はになります(*foo)(1, 2)。それはoperator*定義されたものを必要としますが、私たちは通常、foo->barと同等であると期待しているので(*foo).bar、それは合理的であるように思われます。

Fooを定義するオブジェクトを指す、ある種のスマートポインタクラスである場合、operator()これはオブジェクトのを呼び出す最も簡潔な方法になりますoperator()

しかし、詳細がなければ(そして、実際に有効なC ++である式を提供しなければ、operator(1, 2)あなたが書いたようにそれが有効になる方法はありません)、あなたの質問に答えることは不可能です。私はあなたが何をしようとしているのかを推測しているだけです。

于 2010-04-04T00:48:25.883 に答える
0

いいえ。ただし、クラスへの書き込み権限があると仮定すると、operator()を呼び出す別のメンバー関数を定義すると、次のようになります。

foo->myfunc(1,2);

あなたがこの位置にいることに気付いたということは、あなた(またはこのクラスを書いた人)が演算子のオーバーロードで少し可愛すぎることを示しています。

于 2010-04-04T01:26:44.143 に答える