C++ 编译时位掩码添加
C++ compile-time bitmask addition
我有许多位掩码要添加(层,逻辑或 |
),但由于它们是常量,我想在编译时添加。进入高级模板领域...
我试过递归:
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;
};
出现以下错误:
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 {
^
我也尝试了这种奇怪的语法,(大概)是对 parameter packs 上的 cppreference 页面的误解:
template <uint8_t...masks>
struct MaskAdd {
static const uint8_t value = (masks | ...);
};
引发了这些错误:
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<
地狱的某个地方,如果有人能解释一下,我将不胜感激。
您在这个表达式中有错字:
masks | MaskAdd<masks>::value
应该是:
mask | MaskAdd<masks...>::value
// ^ no 's' ^ the expansion compiler was talking about
然后它会抱怨 class 的重新声明,所以提供一个专门化(对于单个参数):
template <uint8_t mask>
struct MaskAdd<mask> { .. };
这是我的编译时掩码方法...
第一个模板化参数是从右数的位的位置,第二个是向左设置为 1 的位数。
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):
unsigned mask = Mask<1, 3>::val;
我有许多位掩码要添加(层,逻辑或 |
),但由于它们是常量,我想在编译时添加。进入高级模板领域...
我试过递归:
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;
};
出现以下错误:
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 {
^
我也尝试了这种奇怪的语法,(大概)是对 parameter packs 上的 cppreference 页面的误解:
template <uint8_t...masks>
struct MaskAdd {
static const uint8_t value = (masks | ...);
};
引发了这些错误:
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<
地狱的某个地方,如果有人能解释一下,我将不胜感激。
您在这个表达式中有错字:
masks | MaskAdd<masks>::value
应该是:
mask | MaskAdd<masks...>::value
// ^ no 's' ^ the expansion compiler was talking about
然后它会抱怨 class 的重新声明,所以提供一个专门化(对于单个参数):
template <uint8_t mask>
struct MaskAdd<mask> { .. };
这是我的编译时掩码方法... 第一个模板化参数是从右数的位的位置,第二个是向左设置为 1 的位数。
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):
unsigned mask = Mask<1, 3>::val;