假设我有一个包含值的LimitedValue类,并在int类型'min'和'max'上进行参数化.您可以将它用作容纳值的容器,该值只能在一定范围内.你可以使用它:
LimitedValue< float, 0, 360 > someAngle( 45.0 );
someTrigFunction( someAngle );
Run Code Online (Sandbox Code Playgroud)
这样'someTrigFunction'知道它可以保证提供有效的输入(如果参数无效,构造函数会抛出异常).
但是,复制构造和分配仅限于完全相同的类型.我希望能够做到:
LimitedValue< float, 0, 90 > smallAngle( 45.0 );
LimitedValue< float, 0, 360 > anyAngle( smallAngle );
Run Code Online (Sandbox Code Playgroud)
并在编译时检查该操作,因此下一个示例给出了一个错误:
LimitedValue< float, -90, 0 > negativeAngle( -45.0 );
LimitedValue< float, 0, 360 > postiveAngle( negativeAngle ); // ERROR!
Run Code Online (Sandbox Code Playgroud)
这可能吗?是否有一些实际的方法可以做到这一点,或者有哪些例子可以解决这个问题?
我试图将基于整数值的特化作为模板类型.如果我使用单个整数,专业化是直截了当的.是否可以在不使用boost基础的情况下基于范围进行简单的模板专业化.
这是代表性的代码转换为
template <typename int val>
class Param
{
public:
};
template <> class Param<0 to 100>
{
};
template <> class Param<100 to 175>
{
};
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个用于处理比特流的模板类.我想有模板声明的底层整数类型,将解决要么uint8_t,uint16_t,uint32_t或者uint64_t,取决于模板参数(int类型,位数).我发现关于这方面(这两个答案,我怎么能专门为整数范围内的C++模板?和整数一系列基于模板特),并实施了以下代码:
template<int BITS>
class MyClass {
typedef typename
std::conditional< BITS <= 8, uint8_t,
std::conditional< BITS <= 16, uint16_t,
std::conditional< BITS <= 32, uint32_t, uint64_t > > >::type
int_type;
...
}
Run Code Online (Sandbox Code Playgroud)
在我的程序中,我实例化MyClass<32>,但在编译时,我收到以下错误:
no known conversion for argument 1 from ‘uint32_t {aka unsigned int}’ to ‘MyClass<32>::int_type {aka std::conditional<false, short unsigned int, std::conditional<true, unsigned int, long unsigned int> >}’
Run Code Online (Sandbox Code Playgroud)
如果我实例化MyClass<8>,一切正常.所以看起来只有第一级std::conditional实际上是扩展的.
知道如何正确地做到这一点?
编辑:我之前没有说过,但我正在寻找一种解决方案,它也适用于任何位大小的实例化(只要它最多为64位).所以我也想MyClass<27>工作(选择 …