ホームページ > バックエンド開発 > C++ > テンプレート関数を C のテンプレート引数として渡すことはできますか?

テンプレート関数を C のテンプレート引数として渡すことはできますか?

Mary-Kate Olsen
リリース: 2024-11-02 18:44:02
オリジナル
398 人が閲覧しました

Can Template Functions Be Passed as Template Arguments in C  ?

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

C では、関数ポインターまたはテンプレートを通じて汎用プログラミングを実現できます。テンプレートはインライン関数呼び出しを保証しますが、汎用関数自体を扱う場合には制限に直面します。

問題ステートメント

次のコードを検討してください:

<code class="cpp">void a(int) {
    // do something
}
void b(int) {
    // something else
}

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

このテンプレート関数は function1 と function2 の間の繰り返しを単純化しますが、a と b が汎用である場合には問題が発生しますそれ自体:

<code class="cpp">template<typename T>
void a(T t) {
    // do something
}

template<typename T>
void b(T t) {
    // something else
}

template< ...param... > // ???
void function() {
    param<SomeType>(someobj);
    param<AnotherType>(someotherobj);
}</code>
ログイン後にコピー

解決策: テンプレート テンプレート パラメーター

ジェネリック関数 a および b を使用してジェネリック関数を定義するには、テンプレート テンプレート パラメーターを使用する必要があります。ただし、これらの関数を型として直接渡すことはできません。したがって、ダミー構造体を使用した回避策を使用します。

<code class="cpp">template<typename T>
struct a {
    static void foo(T = T()) {}
};

template<typename T>
struct b {
    static void foo(T = T()) {}
};

template<template<typename P> class T>
void function() {
    T<SomeObj>::foo();
    T<SomeOtherObj>::foo();
}</code>
ログイン後にコピー

テンプレート テンプレート パラメーターをダミー構造体 a および b として指定することで、テンプレート関数をインスタンス化し、関数内で汎用の foo メソッドを呼び出すことができます。

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

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