変数がC ++のクラス、構造体、または基本型である場合、コンパイル時にアサートする方法はありますか?

StackOverflow https://stackoverflow.com/questions/828442

  •  06-07-2019
  •  | 
  •  

質問

変数がクラス、構造、または基本型であるかどうかを確認できるテンプレートクラスを実装しようとしています。

これまでのところ、私はこれを持っています:

template< typename T >
class is_class
{
private:
    template< typename X >
    static char ( &i_class( void(X::*)() ) )[1];
    //
    template< typename X >
    static char ( &i_class( X ) )[2];
public:
    static bool const val = sizeof( i_class< T >(0) ) == 1;
};

および使用法:

is_class< int >::val; // false
is_class< some_class_type >::val; // true

問題は、このコードで使用できるすべてのクラスに空のvoid関数を記述する必要があることです。

この問題の解決策を知っている人はいますか

役に立ちましたか?

解決

is_class はBoost.Type_Traitsライブラリのメンバーです。実装は、おそらくあなたがすでに持っているものに似ています。必要に応じて、 enable_if と組み合わせて関数を作成します:

template <class T>
   typename enable_if_c<boost::is_class<T>::value>::type 
     foo() {  }

または同等のもの:

template <class T>
   typename enable_if<boost::is_class<T>>::type 
     foo() {  }

関数 foo は、型 T がクラス型の場合にのみ生成されます。

関数の戻り値は、生成される場合、 enable_if テンプレートの2番目のパラメーター(省略)です(デフォルトは void です)。

他のヒント

ブーストのタイプ特性。

コンパイル時にのみアサートする場合は、 BOOST_STATIC_ASSERT および Boost.TypeTraits を使用して、タイプが適切かどうかを確認します。特定のタイプのテンプレートを有効にする場合は、Boostの enable_if

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top