オーバーロードされた関数へのポインターの指定
C の領域では、同じ名前を共有するオーバーロードされた関数に遭遇することは珍しくありません。入力パラメータが異なります。これは、このような関数を std::for_each() のような汎用アルゴリズムに引数として渡そうとするときに問題になります。
クラス内のネストされたオーバーロード関数
次の点を考慮してください。たとえば、クラス内でオーバーロードが発生する場合:
class A { public: void f(char c); void f(int i); void scan(const std::string& s) { std::for_each(s.begin(), s.end(), f); } };
ここでは、scan() を呼び出します。文字列を含むメソッドを使用すると、コンパイラは f のどの実装を使用するか不明なままになります。デフォルトでは、f() は引数として文字を受け取ります。ただし、ユーザーは整数を受け入れるオーバーロードを使用することを意図している可能性があります。
明示的なポインター割り当て
この曖昧さを解決するために、目的のオーバーロードを明示的に指定することができます。 using static_cast<>():
// 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));
をキャストすることで、適切な型への関数ポインタを使用すると、どのオーバーロードを呼び出す必要があるかをコンパイラに明示的に示すことができます。
関数ポインタを使用した代替方法
別の方法は、関数ポインタを宣言することです。明示的に:
// The compiler will figure out which f to use according to // the function pointer declaration. void (*fpc)(char) = &f; std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload void (*fpi)(int) = &f; std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
特定のシグネチャを持つ関数ポインターを作成することで、コンパイラーは正しいオーバーロードを自動的に決定できます。
メンバー関数の処理
オーバーロードされた関数がメンバー関数の場合は、別のアプローチが必要です。 mem_fun テンプレートの使用を検討するか、提供された回答にリンクされている Dobb 博士の記事などの追加リソースを参照してください。
以上がC でオーバーロードされた関数へのポインターを指定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。