Boost ライブラリで is_complete テンプレートを探しているときに、そのようなテンプレートが Boost.TypeTraits 内に存在しないことが明らかになりました。これにより、その不在の背後にある理論的根拠と、そのようなテンプレートの潜在的な設計について疑問が生じます。
次のコード スニペットを考えてみましょう:
<code class="cpp">//! Check whether type complete template<typename T> struct is_complete { static const bool value = ( sizeof(T) > 0 ); }; ... // use it in such a way BOOST_STATIC_ASSERT( boost::is_complete<T>::value );</code>
このコードには、不完全な型に sizeof を適用するという欠陥があります。は違法です。したがって、代替ソリューションが模索されています。
考えられるアプローチの 1 つは、SFINAE の使用です。ただし、一般に One Definition Rule (ODR) に違反せずに問題を解決することはできないため、これには制限が生じます。
Alexey Malistov によって提案されたプラットフォーム固有のソリューションは、わずかな変更を加えて MSVC で利用できます。
<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>
残念ながら、__COUNTER__ マクロの使用は標準化されていないため、異なるコンパイラ間での適用性が制限される可能性があります。
以上がBoost.TypeTraits に「is_complete」テンプレートがないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。