変数がC ++のクラス、構造体、または基本型である場合、コンパイル時にアサートする方法はありますか?
-
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 。
所属していません StackOverflow