Предположим, что у меня есть класс LimitedValue, который содержит значение и параметризуется по типам int 'min' и 'max'. Вы использовали бы его как контейнер для хранения значений, которые могут находиться только в определенном диапазоне. Вы можете использовать его так:
LimitedValue< float, 0, 360 > someAngle( 45.0 );
someTrigFunction( someAngle );
так что "someTrigFunction" знает, что ему будет предоставлен допустимый ввод (конструктор будет генерировать исключение, если параметр недействителен).
Скопированная конструкция и назначение ограничены ровно равными типами. Я хотел бы иметь возможность:
LimitedValue< float, 0, 90 > smallAngle( 45.0 );
LimitedValue< float, 0, 360 > anyAngle( smallAngle );
и эта операция была проверена во время компиляции, поэтому следующий пример дает ошибку:
LimitedValue< float, -90, 0 > negativeAngle( -45.0 );
LimitedValue< float, 0, 360 > postiveAngle( negativeAngle ); // ERROR!
Возможно ли это? Есть ли какой-нибудь практический способ сделать это или какие-либо примеры, которые подходят к этому?