template <int number1>
typename boost::enable_if_c< (number1 >= 10) >::type
reportErrorIfLessThan10() {
// ...
}
上面enable_if
没有 _c 因为我们有一个普通的布尔值,看起来像这样:
template<bool C, typename T = void>
struct enable_if {
typedef T type;
};
template<typename T>
struct enable_if<false, T> { };
Boost不enable_if
采用纯布尔值,因此它们有另一个附加了 _c 的版本,它采用纯布尔值。您将无法将其称为number1
< 10。SFINAE将排除该模板作为可能的候选者,因为如果条件评估为,enable_if
则不会公开类型。如果您出于某种原因想要在函数中对其进行测试,那么如果您有可用的C++1x功能,则可以使用:::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 );
}
它在这里打印:
错误:“sizeof”对不完整类型“detail::number1_greater_than_10”的无效应用
但我认为第一种方法,使用enable_if
会做到这一点。您将收到有关未声明的错误消息reportErrorIfLessThan10
。