首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++编译时位掩码加法

C++编译时位掩码加法
EN

Stack Overflow用户
提问于 2016-06-24 10:40:49
回答 2查看 802关注 0票数 2

我有许多位掩码要添加(层、逻辑或|),但由于它们是常量,所以我希望在编译时这样做。进入高级模板领域..。

我尝试过递归:

代码语言:javascript
复制
template <uint8_t mask, uint8_t...masks>
struct MaskAdd {
    static const uint8_t value = masks | MaskAdd<masks>::value;
};

template <uint8_t mask>
struct MaskAdd {
    static const uint8_t value = mask;
};

这导致了以下错误:

代码语言:javascript
复制
file.cpp:3:55: error: parameter packs not expanded with ‘...’:
  static const uint8_t value = masks | MaskAdd<masks>::value;
                                                       ^
file.cpp:3:55: note:         ‘masks’
file.cpp:7:8: error: redeclared with 1 template parameter
 struct MaskAdd {
        ^
file.cpp:2:8: note: previous declaration ‘template<unsigned char mask, unsigned char ...masks> struct MaskAdd’ used 2 template parameters
 struct MaskAdd {
        ^

我还尝试了这种奇怪的语法,这可能是因为(大概)对参数包上的cp偏好页面产生了误解。

代码语言:javascript
复制
template <uint8_t...masks>
struct MaskAdd {
    static const uint8_t value = (masks | ...);
};

造成这些错误的原因是:

代码语言:javascript
复制
file.cpp:3:43: error: expected primary-expression before ‘...’ token
     static const uint8_t value = (masks | ...);
                                           ^
file.cpp:3:43: error: expected ‘)’ before ‘...’ token

我有一种感觉,解决办法是在template<template<地区的地狱,如果有人能解释,我会感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-24 10:52:20

您在这个表达式中输入了错误:

代码语言:javascript
复制
masks | MaskAdd<masks>::value

它应该是:

代码语言:javascript
复制
mask | MaskAdd<masks...>::value
// ^ no 's'          ^ the expansion compiler was talking about

然后,它会抱怨类的重声明,因此提供专门化(对于单个参数):

代码语言:javascript
复制
template <uint8_t mask>
struct MaskAdd<mask> { .. };
票数 4
EN

Stack Overflow用户

发布于 2018-04-16 19:24:39

这是我的编译时间掩码..。第一个模板参数是从右开始的位计数的位置,第二个是设置为1向左的位数。

代码语言:javascript
复制
template <unsigned START, unsigned RANGE>
struct Mask
{
    static const size_t val = 1 << START | Mask<START + 1, RANGE - 1>::val;
};

template <unsigned START>
struct Mask<START, 0>
{
    static const size_t val = 0;
};

如果我想创建一个掩码,例如,14 (0000 1110):

代码语言:javascript
复制
unsigned mask = Mask<1, 3>::val;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38011458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档