ホームページ > バックエンド開発 > C++ > std::for_each() のオーバーロードされた関数のあいまいさを解決する方法は?

std::for_each() のオーバーロードされた関数のあいまいさを解決する方法は?

Barbara Streisand
リリース: 2024-12-20 18:55:17
オリジナル
764 人が閲覧しました

How to Resolve Overloaded Function Ambiguity in std::for_each()?

std::for_each() アルゴリズムのオーバーロードされた関数へのポインター

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート