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

C でオーバーロードされた関数へのポインターを指定するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-30 05:03:08
オリジナル
950 人が閲覧しました

How Can I Specify a Pointer to an Overloaded Function in C  ?

オーバーロードされた関数へのポインターの指定

C の領域では、同じ名前を共有するオーバーロードされた関数に遭遇することは珍しくありません。入力パラメータが異なります。これは、このような関数を std::for_each() のような汎用アルゴリズムに引数として渡そうとするときに問題になります。

クラス内のネストされたオーバーロード関数

次の点を考慮してください。たとえば、クラス内でオーバーロードが発生する場合:

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

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

ここでは、scan() を呼び出します。文字列を含むメソッドを使用すると、コンパイラは f のどの実装を使用するか不明なままになります。デフォルトでは、f() は引数として文字を受け取ります。ただし、ユーザーは整数を受け入れるオーバーロードを使用することを意図している可能性があります。

明示的なポインター割り当て

この曖昧さを解決するために、目的のオーバーロードを明示的に指定することができます。 using 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));
ログイン後にコピー

をキャストすることで、適切な型への関数ポインタを使用すると、どのオーバーロードを呼び出す必要があるかをコンパイラに明示的に示すことができます。

関数ポインタを使用した代替方法

別の方法は、関数ポインタを宣言することです。明示的に:

// 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
ログイン後にコピー

特定のシグネチャを持つ関数ポインターを作成することで、コンパイラーは正しいオーバーロードを自動的に決定できます。

メンバー関数の処理

オーバーロードされた関数がメンバー関数の場合は、別のアプローチが必要です。 mem_fun テンプレートの使用を検討するか、提供された回答にリンクされている Dobb 博士の記事などの追加リソースを参照してください。

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

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