假设我有一个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!
这可能吗?是否有一些实用的方法可以执行此操作,或者有任何示例可以实现此目的?
最佳答案
您可以使用模板执行此操作-尝试执行以下操作:
template< typename T, int min, int max >class LimitedValue {
template< int min2, int max2 >LimitedValue( const LimitedValue< T, min2, max2 > &other )
{
static_assert( min <= min2, "Parameter minimum must be >= this minimum" );
static_assert( max >= max2, "Parameter maximum must be <= this maximum" );
// logic
}
// rest of code
};