История изменений
Исправление 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% ошибка и нужно прервать компиляцию с ошибкой. Можно ли так?