template <int number1>
typename boost::enable_if_c< (number1 >= 10) >::type
reportErrorIfLessThan10() {
// ...
}
enable_if
単純な bool があるため、上記の _c なしでは、次のようになります。
template<bool C, typename T = void>
struct enable_if {
typedef T type;
};
template<typename T>
struct enable_if<false, T> { };
Boostenable_if
は単純なブール値を取らないため、_c が追加された別のバージョンがあり、単純なブール値を取ります。number1
10未満の場合は呼び出すことができません。条件が に評価された場合、型を公開しないため、 SFINAEはそのテンプレートを可能な候補から除外します。何らかの理由で関数でテストしたい場合は、C++1x機能が利用可能であれば、次を使用できます。enable_if
::type
false
static_assert
template <int number1>
void reportErrorIfLessThan10() {
static_assert(number >= 10, "number must be >= 10");
}
そうでない場合は、BOOST_STATIC_ASSERT を使用できます。
template <int number1>
void reportErrorIfLessThan10() {
BOOST_STATIC_ASSERT(number >= 10);
}
ただし、説明的なメッセージを表示する唯一の方法は static_assert を使用することです。エラー状態を説明する名前を持つ型を使用して、多かれ少なかれそれをシミュレートできます。
namespace detail {
/* chooses type A if cond == true, chooses type B if cond == false */
template <bool cond, typename A, typename B>
struct Condition {
typedef A type;
};
template <typename A, typename B>
struct Condition<false, A, B> {
typedef B type;
};
struct number1_greater_than_10;
}
template <int number1>
void reportErrorIfLessThan10() {
// number1 must be greater than 10
sizeof( typename detail::Condition< (number1 >= 10),
char,
detail::number1_greater_than_10
>::type );
}
これをここに出力します:
エラー: 不完全なタイプ 'detail::number1_greater_than_10' への 'sizeof' の適用が無効です
しかし、最初のアプローチである using で十分だと思いますenable_if
。undeclared に関するエラー メッセージが表示されreportErrorIfLessThan10
ます。