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. <em>SFINAE исключит этот шаблон в качестве возможных кандидатов, поскольку enable_if
не предоставит тип ::type
, если условие оценивается как false
. Если по какой-то причине вы хотите проверить это в функции, то, если у вас есть функция 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 {
/* 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
.