LINUX.ORG.RU

История изменений

Исправление AndreyKl, (текущая версия) :

спасибо за пояснение и пример использования, разобрался, что то смутил Int с большой буквы... Похоже следить за значением суммы, действительно, получится. Меня немного смущает что можно написать

Int<16> a = 1;
Но на сколько я помню, можно запретить такое поведение создав класс, а не структуру. Но тогда, кажется, и operator+ будет вынужден каждый раз использовать конструктор явно. Или нет?
Но главный вопрос всё таки такой: можно ли как то указать что число должно быть меньше 25, скажем? Т.е. я хотел бы использовать конструкцию вроде
Int<16> a = new Int(16);
Int<3> b = new Int(3);

auto c = a + b; // Int<19>

....

// я хотел тут выразить что ожидается тип Int<N> у которого N <= 17
SomeType<Int<N>: N <= 17> st = new SomeType(c);

И используя такую конструкцию получить компил-тайм ошибку?
Т.е. в итоге , с имеет тип Int<19>, а ограничение у SomeType стоит "Int<N> такой что N меньше либо равно 17". Т.е. понятно что я могу добавить банально проверку в конструктор SomeType<17> и проверять в рантайме значение на предмет того что оно меньше «переданного» из темплейта. Но это в рантайме. А в данной ситуации уже во время компиляции видно что здесь 100% ошибка и нужно прервать компиляцию с ошибкой. Можно ли так?

Исправление AndreyKl, :

спасибо за пояснение и пример использования, разобрался, что то смутил Int с большой буквы... Похоже следить за значением суммы, действительно, получится. Меня немного смущает что можно написать

Int<16> a = 1;

Но на сколько я помню, можно запретить такое поведение создав класс, а не структуру. Но тогда, кажется, и operator+ будет вынужден каждый раз использовать конструктор явно. Или нет?
Но главный вопрос всё таки такой: можно ли как то указать что число должно быть меньше 25, скажем? Т.е. я хотел бы использовать конструкцию вроде
Int<16> a = new Int(16);
Int<3> b = new Int(3);

auto c = a + b; // Int<19>

....

// я хотел тут выразить что ожидается тип Int<N> у которого N <= 17
SomeType<Int<N>: N <= 17> st = new SomeType(c);


И используя такую конструкцию получить компил-тайм ошибку?

Т.е. в итоге , с имеет тип Int<19>, а ограничение у SomeType стоит "Int<N> такой что N меньше либо равно 17". Т.е. понятно что я могу добавить банально проверку в конструктор SomeType<17> и проверять в рантайме значение на предмет того что оно меньше «переданного» из темплейта. Но это в рантайме. А в данной ситуации уже во время компиляции видно что здесь 100% ошибка и нужно прервать компиляцию с ошибкой. Можно ли так?

Исходная версия AndreyKl, :

спасибо за пояснение, разобрался и пример использования.. что то смутил Int с большой буквы..

Похоже следить за значением суммы, действительно, получится, если немного поколдовать над подсчётом размерности.

Меня смущает что можно написать

Int<16> a = 1;


Но на сколько я помню, можно запретить такое поведение создав класс, а не структуру. Но тогда, кажется, и operator+ будет вынужден каждый раз использовать конструктор явно. Или нет?

Но главный вопрос всё таки такой: можно ли как то указать что число должно быть меньше 25, скажем?

т.е. я хотел бы использовать конструкцию вроде

Int<16> a = new Int(16);
Int<3> b = new Int(3);

auto c = a + b; // Int<19>

....

// я хотел тут выразить что ожидается тип Int<N> у которого N <= 17
SomeType<Int<N>: N <= 17> st = new SomeType(c);



И используя такую конструкцию получить компил-тайм ошибку?

Т.е. в итоге , с имеет тип Int<19>, а ограничение у SomeType стоит "Int<N> такой что N меньше либо равно 17".

Т.е. понятно что я могу добавить банально проверку в конструктор SomeType<17> и проверять в рантайме значение на предмет того что оно меньше «переданного» из темплейта. Но это в рантайме. А в данной ситуации уже во время компиляции видно что здесь 100% ошибка и нужно прервать компиляцию с ошибкой. Можно ли так?