簡體   English   中英

C ++編譯時位掩碼添加

[英]C++ compile-time bitmask addition

我要添加許多位掩碼(層,邏輯OR | ),但是由於它們是常量,所以我想在編譯時這樣做。 輸入高級模板領域...

我嘗試了遞歸:

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 {
        ^

我還嘗試了這種奇怪的語法,(可能是)對參數包上的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

然后它將抱怨該類的重新聲明,因此請提供專門化(針對單個參數):

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM