C でテンプレート関数を引数として渡すにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-02 13:10:02
オリジナル
870 人が閲覧しました

How Can Template Functions be Passed as Arguments in C  ?

テンプレート引数としてのテンプレート関数の説明

C では、関数ポインターまたはテンプレートを使用して汎用プログラミングを実現できます。テンプレートを使用すると、コンパイラーが関数をインライン化できるため効率が向上し、パフォーマンスが向上します。

2 つの関数 a と b が、若干の違いはあるものの同様の操作を実行するシナリオを考えてみましょう。コードの重複を避けるために、テンプレートを使用して汎用関数を定義できます。

<code class="c++">template<void (*param)(int)>
void function() {
    param(123);
    param(456);
}</code>
ログイン後にコピー

このテンプレートは関数ポインターを引数として受け取り、実行する特定の関数を実行時に選択できるようにします。この例では、 function<>

テンプレート引数を持つテンプレート関数

ただし、a と b 自体がジェネリック関数である場合には制限が生じます。テンプレート パラメーターは型、テンプレート タイプ、値のいずれかになりますが、引数としてテンプレート関数を渡すことを直接サポートするものはありません。

この課題を克服するには、「テンプレート テンプレート パラメーター」を使用できます。ただし、テンプレート関数を型として使用するにはインスタンス化が必要なため、実用的ではありません。回避策には、ダミー構造体の使用が含まれます。

<code class="c++">struct a { static void foo () {}; };
struct b { static void foo () {}; };

template <template <typename P> class T>
void function ()
{
    T<SomeObj>::foo ();
    T<SomeOtherObj>::foo ();
}

int main ()
{
    function<a>();
    function<b>();
}</code>
ログイン後にコピー

この例では、a と b は構造体内の静的メンバー関数としてカプセル化されています。関数引数としてテンプレート構造体を受け取り、基本的に呼び出されるテンプレート関数を表します。この構造体を渡すことにより、特定の foo 関数をさまざまな型に対して実行できます。

したがって、このアプローチにより、テンプレート関数を引数として受け入れることができるジェネリック関数を定義でき、C ジェネリックで柔軟で再利用可能なコードが可能になります。

以上がC でテンプレート関数を引数として渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!