ホームページ > バックエンド開発 > C++ > オーバーロードされた関数を std::for_each() に渡すときのあいまいさを解決するにはどうすればよいですか?

オーバーロードされた関数を std::for_each() に渡すときのあいまいさを解決するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-17 07:00:26
オリジナル
1005 人が閲覧しました

How to Resolve Ambiguity When Passing Overloaded Functions to std::for_each()?

オーバーロードされた関数を 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)>(&amp;f));
// Uses the void f(int i); overload
std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(&amp;f));
ログイン後にコピー

解決策 2: ポインタ宣言

あるいは、関数シグネチャを暗黙的に指定するポインタ宣言を利用することもできます。このアプローチにより、コンパイラーは呼び出す適切なオーバーロードを自動的に推定できます。

// The compiler will figure out which f to use according to
// the function pointer declaration.
void (*fpc)(char) = &amp;f;
std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload
void (*fpi)(int) = &amp;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 サイトの他の関連記事を参照してください。

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