Добрый день.
Подскажите есть какой-то способ проверить параметры шаблона на этапе компиляции и выдать сообщение об ошибке?
Вот к примеру есть такой шаблон. Надо проверить допустимость параметра на заданный диапазон и выдать осмысленное сообщение об ошибке.
CODE
template <size_t length> struct ir_base {
enum { _MIN_LEN = 2, _MAX_LEN = 32, _MAX_INT = 0xFFFFFFFF };
private:
enum { __len = (length<_MIN_LEN) ? -1 : ( length > _MAX_LEN ? -1 : 0 ) , __rshift = length < _MAX_LEN ? _MAX_LEN - length : 0 };
// unused value, rise compiler error negative index if invalid range
static const char m_fake_value[__len];
public:
enum { BYPASS = _MAX_INT >> __rshift };
static const size_t m_length = length;
static const unsigned int m_mask = BYPASS;
static const unsigned int m_bypass = BYPASS;
ir_base() { ... }
~ir_base() { ... }
};
CODE
template <size_t length, bool valid> struct ir_reg_validator {
enum { __length = length };
};
template <size_t length> struct ir_reg_validator<length, false> { };
template <size_t length> struct ir_safe_reg {
enum { IR_MIN_LEN = 2, IR_MAX_LEN = 32, IR_MAX_ID = 0xFFFFFFFF };
enum { IR_LENGTH = ir_reg_validator< length, !( length < IR_MIN_LEN || length > IR_MAX_LEN ) >::__length };
enum { BYPASS = (unsigned)(IR_MAX_ID) >> (IR_MAX_LEN - length) };
static const int m_length = length;
static const int m_bypass = BYPASS;
ir_safe_reg() { }
~ir_safe_reg() { }
};
Данный код не компилится в случае неверного параметра, но адекватного сообщения об ошибке не выдает.
Т.е требуется писать коментарий для пояснения причины ошибки.
Есть какие-то общепринятые методы/способы статической оценки/проверки параметров шаблонов с выдачей сообщения?