Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: C++ проверка параметров шаблона
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
jks
Добрый день.

Подскажите есть какой-то способ проверить параметры шаблона на этапе компиляции и выдать сообщение об ошибке?
Вот к примеру есть такой шаблон. Надо проверить допустимость параметра на заданный диапазон и выдать осмысленное сообщение об ошибке.

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() { }
};


Данный код не компилится в случае неверного параметра, но адекватного сообщения об ошибке не выдает.
Т.е требуется писать коментарий для пояснения причины ошибки.
Есть какие-то общепринятые методы/способы статической оценки/проверки параметров шаблонов с выдачей сообщения?
Kabdim
кмк вам нужны boost::concept_check / boost::staticassert
halfdoom
Если компилятор поддерживает C++11 и выше, то static_assert().

Иначе что-то типа:

Код
#define CONCAT2(a,b)    (a##b)
#define CONCAT(a,b)    CONCAT2(a,b)

template<bool>
struct StaticAssertFailed;

template<>
struct StaticAssertFailed<true> {};

template<int>
struct StaticAssertTest {};

#define static_assert(v) typedef StaticAssertTest<sizeof(StaticAssertFailed<(v)>)> CONCAT(static_assert_at_,__LINE__)

static_assert(1 > 2);
static_assert(1 < 2);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.