C では、テンプレート推定はジェネリック関数のパラメーターの型を推論する際に重要な役割を果たします。ただし、場合によっては、関数の戻り値の型のみを利用してテンプレートの推論を簡略化することが望ましい場合もあります。
次の例を考えてみましょう。
<code class="cpp">class GC { public: template <typename T> static GCPtr<T> Allocate(); };</code>
ここで、Allocate 関数はジェネリック型パラメーターを受け取ります。 T を返し、T 型のオブジェクトへのポインタを返します。テンプレート演繹を使用すると、次のようにオブジェクトを割り当てるための構文を簡略化することができます。
<code class="cpp">GCPtr<A> ptr1 = GC::Allocate(); // Desired output</code>
残念ながら、これは C では不可能です。関数の型はテンプレートの推定には関与しません。代わりに、テンプレート署名は関数呼び出しの引数に基づいて照合されます。
代替解決策:
回避策の 1 つは、明示的な型指定を隠すヘルパー関数を利用することです。
<code class="cpp">template <typename T> void Allocate(GCPtr<T>& p) { p = GC::Allocate<T>(); } int main() { GCPtr<A> p = 0; Allocate(p); }</code>
このアプローチでは、Allocate 関数は引数としてポインターへの参照を受け取り、実際の割り当ては内部で処理されます。これにより、柔軟性を損なうことなく使用を簡素化できます。
C 11 の機能強化:
C 11 では、テンプレート推定ルールが拡張され、型宣言の 1 つを省略できるようになりました。 :
<code class="cpp">auto p = GC::Allocate<A>(); // p is of type GCPtr<A></code>
これにより構文がさらに簡素化され、特定のシナリオでより便利になります。
以上が関数の戻り値の型を使用して C テンプレートの推定を簡素化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。