2

整数に関する 2 つの特性が必要です。

  1. 最初のものはstd::is_integral(またはboost::is_integral) のようになりますが、ユーザー定義型 (たとえば、 anintをラップするクラスなど) で使用できますint_wrapper: 型が整数のように動作し、その表現が標準の整数型のようである場合 (たとえばsizeof(T) * CHAR_BITS == std::numeric_limits<T>::digitsTが符号なしの場合) はtrue ですが、整数型の定義は、これらの型のリストで構成されるという点で非常に厳密です。したがって、禁止されていない場合、特殊std::is_integral化は難しいようです(明示的に述べられていないと思いますis_integralが):「プライマリ」タイプの特性です(20.7.4.1、注3:タイプTに対して正確に1つのプライマリタイプの特性が真です。私の場合int_wrapperはすでにis_class等しいです真に)。この特性を に特化した場合、どのようなリスクがありますint_wrapperか? 私のニーズに合った特性クラス (Boost など) を知っていますか?

  2. 必要な 2 番目の特性は、整数セマンティクス (ビット算術演算、ビット操作など) を持つ型用です。たとえば、mpz_classfrom GMP はこの特性を満たします。std::numeric_limits<T>::is_integerこの特性に適していますか?が整数のように動作するnumeric_limits<T>::is_integer == true場合は特殊化して設定しても問題ないことと、 (C++ 標準では)「整数」と「整数」という用語は同義語であることの両方を読みました (この場合、常に を持っている必要があります) 。Tnumeric_limits<T>::is_integer == is_integral<T>::value

結論として、正確なニーズに合わせて独自の特性を定義するのと、標準の特性を拡張してみるのとではどちらがよいでしょうか?

4

1 に答える 1

2

ブーストやその他の標準ライブラリがクラスを一体として扱うかどうかによって異なります。もしそうなら、std/boost::is_integral<> を特殊化する以外に方法はありません。それ以外の場合は、独自の is_integral<> を作成し、そのデフォルトの実装を std/boost::is_integral<> に転送して、統合ラッパー用に特化します。

于 2010-08-10T11:07:15.383 に答える