7

メンバー関数には、暗黙のthisポインターパラメーターがあります。では、なぜstd::functionこの署名を受け入れるのでしょうか。ここで、Sは単純なクラスです。(完全なサンプル

std::function<void(S &)> func = &S::foo;

それを呼び出すことも機能し、オブジェクトを区別します。

S s1 = {5};
S s2 = {6};

func(s1); //prints 5
func(s2); //prints 6

私が通常期待するのは、ポインタが必要なことです。これも機能します:(完全なサンプル

std::function<void(S * const)> func = &S::foo;

S s1 = {5};
S s2 = {6};

func(&s1); //prints 5
func(&s2); //prints 6

this暗黙のパラメーターがポインターであるときにメンバー関数に参照を渡すと、最初のパラメーターが機能するのはなぜですか?

4

2 に答える 2

5

std::function正しく設計されているためです。ポインタであるという事実thisは、歴史の偶然であり、メンバー関数の内部の詳細です。この事実は、関数のユーザーの設計上の決定に影響を与えるべきではありません。

の設計者はstd::function、当然のことながら、署名の最初のパラメーター型が参照である場合にメンバー関数を受け入れることを決定しました。

于 2012-09-21T04:06:53.877 に答える
3

std::function<SIG>関数のように動作する多くのものか​​ら構築でき、それらを適切なstd::functionオブジェクトに変換します。

この場合void S::foo()、関数のように動作しますvoid foo_x(S&)(どちらもSを呼び出す必要があり、変更する可能性がありS、何も返さないため)。したがってstd::function<void(S&)>、メンバー関数を関数オブジェクトに変換するためのコンストラクターを提供します。つまり

std::function<void(S &)> func = &S::foo;

のようなコンストラクターを使用して、std::function<void(S&)>( void(S::)() )次と同等のものを作成します。

void foo_x(S & s ) { return s.foo(); }
std::function<void(S&)> func = foo_x;

同様に、

std::function<void(S * const)> func = &S::foo;

と同等です

void foo_x(S * const s ) { return s->foo(); }
std::function<void(S* const )> func = foo_x;

のようなコンストラクタを介してstd::function<void(S* const )>( void(S::)() )

于 2012-09-21T04:07:04.533 に答える