ホームページ > バックエンド開発 > C++ > Boost.TypeTraits に「is_complete」テンプレートがないのはなぜですか?

Boost.TypeTraits に「is_complete」テンプレートがないのはなぜですか?

Linda Hamilton
リリース: 2024-10-31 04:07:53
オリジナル
996 人が閲覧しました

 Why is there no `is_complete` template in Boost.TypeTraits?

Boost ライブラリの Is_Complete テンプレート

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 &amp; getT();   
      static char (&amp; 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート