C のオーバーロード関数ポインター
C では、オーバーロード関数は、異なるシグネチャを持つ複数の実装を持つ関数です。オーバーロードされた関数が汎用アルゴリズムに渡される場合、どの実装を使用するかを指定するのは難しい場合があります。
次の例を考えてみましょう。
class A { void f(char c); void f(int i); void scan(const std::string& s) { std::for_each(s.begin(), s.end(), f); // Overloaded function passed to 'for_each' } };
ここでは、クラス A があります。それぞれ char と int をパラメーターとして受け取る f という名前の 2 つのオーバーロードされたメンバー関数を使用します。 A のスキャン メンバー関数は、for_each アルゴリズムを使用して文字列を反復処理し、文字ごとに f 関数を呼び出そうとします。
問題:
ただし、コンパイラはstd::for_each に渡されるときに f のどの実装を使用するかを自動的に決定することはできません。これは、アルゴリズムが特定のシグネチャを持つ関数ポインターを予期しており、オーバーロードされた関数シグネチャーを汎用関数ポインターの型に基づいて相互に区別できないためです。
解決策:
使用する f のオーバーロードを指定するには、次のいずれかを使用できます。テクニック:
1.関数シグネチャを使用した静的キャスト:
static_cast<>() を使用して、関数ポインタを std::for_each:
// Uses the void f(char c); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(char)>(f)); // Uses the void f(int i); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(f));
2.関数ポインタ宣言:
または、必要なシグネチャを持つ関数ポインタを宣言し、それらをオーバーロードされた関数に割り当てることができます:void (*fpc)(char) = &A::f; // Function pointer for void f(char c) std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload void (*fpi)(int) = &A::f; // Function pointer for void f(int i) std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
メンバー関数の場合 (オプション) :
オーバーロードされた関数がメンバー関数の場合、mem_fun ユーティリティを使用することも、リンクされた Dobb 博士の記事で提供されているソリューションを使用して、目的のオーバーロードを指定することもできます。以上がC でオーバーロードされた関数ポインターを渡すときのあいまいさを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。