型が完全であるかどうかを判断することは、プログラミングの重要な側面です。 Boost ライブラリは幅広い TypeTraits を提供しますが、is_complete テンプレートが著しく欠如しています。この記事では、そのようなテンプレートが存在しない理由を調査し、SFINAE を使用する解決策を提案します。
is_complete テンプレートを定義する際の当面の課題は、不完全なテンプレートに sizeof を適用するという事実にあります。タイプが不正です。この制限は、有効なオブジェクト サイズの欠如によって生じる曖昧さや未定義の動作の可能性から生じています。
この制限を回避するために、Alexey Malistov はプラットフォームを提案しました。コンパイラ固有のマクロを活用する特定のソリューション。彼のアプローチは、マクロを呼び出すたびにインクリメントする __COUNTER__ マクロに依存しています。これにより、テスト対象の型ごとに一意のダミー パラメーターを持つテンプレートを構築できます。
このソリューションのコードは次のようになります。
<code class="cpp">namespace { template<class T, int discriminator> struct is_complete { static T & getT(); static char (& pass(T))[2]; static char pass(...); static const bool value = sizeof(pass(getT()))==2; }; } #define IS_COMPLETE(X) is_complete<X,__COUNTER__>::value</code>
is_complete をネストされたクラス テンプレートとして定義することにより、 __COUNTER__ マクロを識別子として利用すると、プラットフォーム固有の方法で型の完全性をチェックできるようになります。 pass 関数は、sizeof を適用し、完全型と不完全型を区別するための仮引数として機能します。
SFINAE (置換失敗はエラーではない) メカニズムが一般的に使用されます。型のプロパティに基づいてテンプレートの特殊化を有効または無効にする場合、型の完全性をチェックするために直接適用することはできません。その理由は、is_complete は型ではなく定数として評価される必要があるためです。
Boost ライブラリに標準の is_complete テンプレートが存在しないのは、sizeof の適用によってもたらされる課題が原因です。不完全型と SFINAE の制限について。ただし、Alexey Malistov によって提案されたソリューションなど、プラットフォーム固有のソリューションは、特定の環境で型の完全性をチェックする実用的な方法を提供できます。
以上がBoost に標準の「is_complete」テンプレートがないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。