ホームページ  >  記事  >  バックエンド開発  >  ## C 17 のクラス テンプレートのテンプレート引数を部分的に推定できますか?

## C 17 のクラス テンプレートのテンプレート引数を部分的に推定できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-25 07:36:29686ブラウズ

## Can We Partially Deduce Template Arguments for Class Templates in C  17?

C 17 の部分的なクラス テンプレート引数の推論

C 17 の機能「クラス テンプレート引数の推論」(CTAD) を使用すると、コンパイラーは自動的に推論できます。インスタンス化時のクラスのテンプレート引数。これにより、コードが簡素化され、明示的なテンプレート引数を指定する必要がなくなります。

しかし、テンプレート引数を部分的に指定し、残りを推測させることはできますか?

試行される解決策 1:

部分的な推論を実現する 1 つの試みには、次のようなエイリアス テンプレートの作成が含まれます。

<code class="cpp">template<class T, class U> using Base2 = Base<T, U, double>;</code>

次に、エイリアスを使用して引数を部分的に指定します。

<code class="cpp">void func() {
    Base2 val(1, 2);
}</code>

ただし、これによりコンパイル エラーが発生し、エイリアス テンプレートの使用には完全なテンプレート引数リストが必要であることが示されます。

回避策:

残念ながら、部分推論は では直接サポートされていません。 C 17. ただし、次のような回避策がいくつかあります。

1.オーバーロード ヘルパー関数:

指定された引数のさまざまなセットを使用してオーバーロード関数を作成し、推論に最も具体的なオーバーロードを使用します:

<code class="cpp">template<class T, class U>
void func(Base<T, U> val) { }

template<class T>
void func(Base<T, double> val) { }

template<>
void func(Base<double> val) { }</code>

2.明示的な引数の推論:

明示的なテンプレート引数の推論を使用して、他の引数を推論しながら特定の引数を指定します:

<code class="cpp">Base val(1, static_cast<double>(4.), false);</code>

3.可変個引数テンプレートを利用する:

複数の引数を受け入れ、テンプレート引数を推定できる可変個引数テンプレートを作成する:

<code class="cpp">template<typename... Args>
class Base {
public:
    Base(Args&&... args) {
        // Custom logic to deduce template arguments from args...
    }
};</code>

結論:

部分的なクラス テンプレート引数の推定は、C 17 では直接サポートされていません。ただし、関数のオーバーロード、明示的な推定、または可変個引数テンプレートなどの回避策を使用することで、同様の効果を達成することが可能です。

以上が## C 17 のクラス テンプレートのテンプレート引数を部分的に推定できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。