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

C でオーバーロードされた関数ポインターを渡すときのあいまいさを解決するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-24 11:16:11
オリジナル
498 人が閲覧しました

How to Resolve Ambiguity When Passing Overloaded Function Pointers in C  ?

C のオーバーロード関数ポインター

C では、オーバーロード関数は、異なるシグネチャを持つ複数の実装を持つ関数です。オーバーロードされた関数が汎用アルゴリズムに渡される場合、どの実装を使用するかを指定するのは難しい場合があります。

次の例を考えてみましょう。

class A {
    void f(char c);
    void f(int i);

    void scan(const std::string& s) {
        std::for_each(s.begin(), s.end(), f); // Overloaded function passed to 'for_each'
    }
};
ログイン後にコピー

ここでは、クラス A があります。それぞれ char と int をパラメーターとして受け取る f という名前の 2 つのオーバーロードされたメンバー関数を使用します。 A のスキャン メンバー関数は、for_each アルゴリズムを使用して文字列を反復処理し、文字ごとに f 関数を呼び出そうとします。

問題:

ただし、コンパイラはstd::for_each に渡されるときに f のどの実装を使用するかを自動的に決定することはできません。これは、アルゴリズムが特定のシグネチャを持つ関数ポインターを予期しており、オーバーロードされた関数シグネチャーを汎用関数ポインターの型に基づいて相互に区別できないためです。

解決策:

使用する f のオーバーロードを指定するには、次のいずれかを使用できます。テクニック:

1.関数シグネチャを使用した静的キャスト:

static_cast<>() を使用して、関数ポインタを std::for_each:

// 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.関数ポインタ宣言:

または、必要なシグネチャを持つ関数ポインタを宣言し、それらをオーバーロードされた関数に割り当てることができます:

void (*fpc)(char) = &A::f; // Function pointer for void f(char c)
std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload

void (*fpi)(int) = &A::f; // Function pointer for void f(int i)
std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
ログイン後にコピー

メンバー関数の場合 (オプション) :

オーバーロードされた関数がメンバー関数の場合、mem_fun ユーティリティを使用することも、リンクされた Dobb 博士の記事で提供されているソリューションを使用して、目的のオーバーロードを指定することもできます。

以上がC でオーバーロードされた関数ポインターを渡すときのあいまいさを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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