戻り値の型に基づく関数のテンプレート推論?
C では、テンプレート推論は、関数呼び出しに指定される引数。ただし、テンプレート推論には、関数の戻り値の型に基づいて型引数を推論できないなど、特定の制限があります。
問題:
オリジナル質問は、次のコードで Allocate() 関数を呼び出すときに型引数を明示的に指定する必要性を排除しようとしています:
<code class="cpp">GCPtr<A> ptr1 = GC::Allocate(); GCPtr<B> ptr2 = GC::Allocate();</code>
答え:
残念ながら、テンプレート戻り値の型に基づいて型引数を推定するために演繹を使用することはできません。代わりに、これは逆です。戻り値の型は、テンプレートの署名が一致した後に決定されます。
回避策:
この制限を回避するには、Allocate( ) 関数は、呼び出し元から型引数を隠すヘルパー関数でラップできます:
<code class="cpp">// helper template <typename T> void Allocate(GCPtr<T>& p) { p = GC::Allocate<T>(); } int main() { GCPtr<A> p = 0; Allocate(p); }</code>
これにより、呼び出し元は型引数を明示的に指定せずに Allocate() 関数を使用できるようになります:
<code class="cpp">GCPtr<A> p = 0; Allocate(p);</code>
追加メモ:
C 11 では auto キーワードが導入されており、コンパイラがイニシャライザから型を推測できるようになります。これにより、コードがさらに簡素化されます:
<code class="cpp">auto p = GC::Allocate<A>(); // p is of type GCPtr<A></code>
以上がC の関数の戻り値の型に基づいてテンプレートの推論は機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。