(레이어, 논리 OR |
)을 추가 할 비트 마스크가 여러 개 있습니다.하지만 이들이 상수이기 때문에 컴파일 타임에 추가하고 싶습니다.C++ 컴파일 타임 비트 마스크 추가
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 페이지에 대한 오해. parameter packs :
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
그런 다음이 클래스의 재 선언에 대해 불평 할 것이다, 그래서 대신에 전문성을 제공 (대한
후자 (마스크 | ...)는 현재 C++ 17 (AFAIK)조차 가지고 있지 않습니다. .. 언젠가. 또한 왜 값을 OR하는 것이 아닌지는 명확하지 않습니다. '|'의 양쪽이 컴파일시의 상수 일 때, 컴파일러는 그것을 최적화 할 수 있고, 그것을 최적화 할 수 있습니다. – lorro
'constexpr'을 사용해 보셨습니까? 또한 컴파일러가 어쨌든 컴파일 타임에 수학을 수행 할 수 있도록 'const'로 만들면 의심됩니다. – Galik
좋은 점 @lorro와 Galik, 나는 컴파일러에 대한 믿음이별로 없다고 생각한다. – Kisss256