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

 
 
 
Reply to this topicStart new topic
> 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
Kabdim
сообщение May 19 2015, 11:12
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



кмк вам нужны boost::concept_check / boost::staticassert
Go to the top of the page
 
+Quote Post
halfdoom
сообщение May 19 2015, 11:46
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Если компилятор поддерживает 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);
Go to the top of the page
 
+Quote Post

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

 


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


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