C での関数の戻り値の型に基づくテンプレートの推論
C では、ジェネリックをインスタンス化するコードを簡素化するためにテンプレートの推論を利用することが望ましい場合があります。関数の引数のデータ型に基づいて関数を決定します。次の例を考えてみましょう:
<code class="cpp">GCPtr<A> ptr1 = GC::Allocate(); GCPtr<B> ptr2 = GC::Allocate();</code>
ジェネリック型パラメーターを明示的に指定する代わりに、GC::Allocate() 関数の戻り値の型を使用してこの推定を達成することが目標です。ただし、C では戻り値の型に基づく型推定は許可されていません。
<code class="cpp">class GC { public: template<typename T> static GCPtr<T> Allocate(); };</code>
戻り値の型がジェネリックであるにもかかわらず、コンパイラはテンプレートの型パラメータ を明示的に指定する必要があります。 GC::Allocate() 関数をインスタンス化するとき。
この制限を軽減するには、補助関数を導入できます。
<code class="cpp">template <typename T> void Allocate(GCPtr<T>& p) { p = GC::Allocate<T>(); }</code>
この関数を使用すると、次のように元の目的を達成できます。 :
<code class="cpp">GCPtr<A> p; Allocate(p);</code>
この構文が明示的な型指定よりも大きな利点があるかどうかは主観的です。
注: C 11 では、次のいずれかを省略できます。 auto キーワードを使用した型宣言:
<code class="cpp">auto p = GC::Allocate<A>(); // p is of type GCPtr<A></code>
以上がC は関数の戻り値の型からテンプレートの型を推測できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。