C では、関数と呼ばれる、名前は同じでパラメーターが異なる関数を持つことができます。過負荷。これにより、オーバーロードされた関数を std::for_each() などの関数に引数として渡すときにあいまいさが生じる可能性があります。
問題:
次のコード スニペットを考えてみましょう。
class A { void f(char c); void f(int i); void scan(const std::string& s) { std::for_each(s.begin(), s.end(), f); } };
この例では、scan() メソッドはオーバーロードされた関数を渡そうとします。 f() から std::for_each() へ。ただし、コンパイラは f() のどのオーバーロードを使用するかを自動的に決定できません。
解決策:
必要なオーバーロードを指定するには、static_cast<>( ) または mem_fun() 関数ポインター。
方法 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: Mem_Fun()
f() がメンバー関数の場合は、mem_fun() 関数ポインターを使用できます。
std::for_each(s.begin(), s.end(), std::mem_fun(&A::f));
このアプローチでは、クラス名とオーバーロードを指定する必要があります。これにより、より冗長になりますが、より柔軟になります。
以上がstd::for_each() のオーバーロードされた関数のあいまいさを解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。