1つの関数がいくつかの可能な関数の1つを呼び出す状況があります。これは、関数をパラメーターとして渡すのに適した場所のようです。ZubkovによるこのQuoaraの回答では、これを行う3つの方法があります。
int g(int x(int)) { return x(1); }
int g(int (*x)(int)) { return x(1); }
int g(int (&x)(int)) { return x(1); }
...
int f(int n) { return n*2; }
g(f); // all three g's above work the same
いつどの方法を使用する必要がありますか?違いは何ですか?私は最も単純なアプローチを好むので、なぜ最初の方法が常に使用されるべきではないのですか?
私の状況では、関数は1回だけ呼び出されますが、簡単にしたいと思います。私はそれをポインタ渡しで使用していて、最後に呼び出される関数がg(myFunc)
どこにmyFunc
あるかを呼び出すだけです。
3
そのなかで何も。テンプレートパラメータを使用します。
—
LF
最初の2つは完全に同等です。3つ目は、最初の2つとほぼ同じですが、左辺値が必要です。
—
Raymond Chen
g(+f);
最初の2つでは機能しますが、3つ目では機能しません。
@RaymondChen「最初の2つは完全に同等です」それから私の見解では、最初の方が単純なので、明らかに正しい選択です。なぜそれをポインターで複雑にするのですか?
—
ノーザン
一方、では
—
Raymond Chen、
int g(int x(int))
、x
ポインタのようには見えませんが、はポインタです。対応するグローバル宣言int x(int);
は、関数ポインターではなく関数を宣言します。
@RaymondChenの主張をバックアップするためのゴッドボルトリンク。放出されたアセンブリ
—
Eric
x
もポインタとしてラベル付けされることに注意してください。