реклама на сайте
подробности

 
 
> C++ проверка параметров шаблона, Шаблоны С++
jks
сообщение May 19 2015, 10:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 3-04-11
Из: .
Пользователь №: 64 084



Добрый день.

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

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


Данный код не компилится в случае неверного параметра, но адекватного сообщения об ошибке не выдает.
Т.е требуется писать коментарий для пояснения причины ошибки.
Есть какие-то общепринятые методы/способы статической оценки/проверки параметров шаблонов с выдачей сообщения?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 12:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01343 секунд с 7
ELECTRONIX ©2004-2016