テンプレート引数としてのテンプレート関数
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 サイトの他の関連記事を参照してください。