オーバーロードされた関数を std::for_each() に渡す
C でオーバーロードされた関数を扱う場合、次のことが必要な状況に遭遇することがあります。これらのオーバーロードの 1 つを std::for_each() などのアルゴリズムに渡します。ただし、コンパイラは、反復子の型に基づいて呼び出す適切なオーバーロードを自動的に決定しない場合があります。
例:
2 つのオーバーロードされた f を持つ次のクラスを考えてみましょう。 () 関数:
class A { void f(char c); void f(int i); void scan(const std::string& s) { std::for_each(s.begin(), s.end(), f); // Error! } };
f() の呼び出しがあいまいなため、コンパイラ エラーが発生します。これを解決するには、使用するオーバーロードを明示的に指定する必要があります。
解決策 1: static_cast を使用する
これを行う 1 つの方法は次のとおりです。次に示すように、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));
解決策 2: ポインタ宣言
あるいは、関数シグネチャを暗黙的に指定するポインタ宣言を利用することもできます。このアプローチにより、コンパイラーは呼び出す適切なオーバーロードを自動的に推定できます。
// 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
メンバー関数
f() 関数がメンバー関数の場合、次のようになります。 mem_fun を使用するか、この Dobb 博士の記事で説明されている解決策を参照する必要があります。
以上がオーバーロードされた関数を std::for_each() に渡すときのあいまいさを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。