条件チェックに SFINAE を利用する
SFINAE (置換の失敗はエラーではありません) は、テンプレート メタプログラミングの強力な手法です。型のプロパティに基づいた条件付きコンパイル。 SFINAE の特に便利なアプリケーションの 1 つは、ブール条件をチェックする機能です。
例: 配列の次元を使用した均等性のチェック
次のコード スニペットを考えてみましょう:
<code class="cpp">template<int I> void div(char(*)[I % 2 == 0] = 0) { /* this is taken when I is even */ } template<int I> void div(char(*)[I % 2 == 1] = 0) { /* this is taken when I is odd */ }</code>
この例では、div 関数は配列パラメーターの次元に基づいてオーバーロードされます。 I が偶数の場合、最初のオーバーロードが使用されます。それ以外の場合は、2 番目のオーバーロードが使用されます。これにより、コンパイル時に I のパリティを効果的にチェックできます。
初期化子リストの境界のチェック
SFINAE のもう 1 つの便利なアプリケーションは、初期化子リストの境界をチェックすることです。たとえば、次の Vector 構造体は、SFINAE を使用して初期化子リスト内の要素の数を制限します。
<code class="cpp">template<int N> struct Vector { template<int M> Vector(MyInitList<M> const& i, char(*)[M <<= N] = 0) { /* ... */ } }</code>
初期化子リストは、要素の数 M が N 以下の場合にのみ受け入れられます。M の場合、 N を超えると、無効な型 char(*)[0] が生成され、SFINAE がテンプレートを破棄します。
または、Boost のenable_if マクロを使用して同じ条件を表現できます。
<code class="cpp">template<int N> struct Vector { template<int M> Vector(MyInitList<M> const& i, typename enable_if_c<M <<= N>::type* = 0) { /* ... */ } }</code>
実用的なアプリケーション
実際には、SFINAE はテンプレートのインスタンス化中に条件をチェックする強力な方法を提供します。これにより、高度な条件機能を備えた柔軟でタイプセーフなコードの開発が可能になります。
以上がテンプレート メタプログラミングでの条件チェックに SFINAE をどのように使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。