相关疑难解决方法(0)

限制C++中的值类型范围

假设我有一个包含值的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)

这可能吗?是否有一些实际的方法可以做到这一点,或者有哪些例子可以解决这个问题?

c++ templates

23
推荐指数
3
解决办法
1万
查看次数

基于整数范围的模板专业化

我试图将基于整数值的特化作为模板类型.如果我使用单个整数,专业化是直截了当的.是否可以在不使用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)

c++ templates

15
推荐指数
2
解决办法
3160
查看次数

如何为多个整数值范围专门化C++模板?

我正在尝试创建一个用于处理比特流的模板类.我想有模板声明的底层整数类型,将解决要么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>工作(选择 …

c++ conditional templates template-specialization

2
推荐指数
1
解决办法
216
查看次数