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