2016-06-24 6 views
2

(레이어, 논리 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 

그런 다음이 클래스의 재 선언에 대해 불평 할 것이다, 그래서 대신에 전문성을 제공 (대한

+1

후자 (마스크 | ...)는 현재 C++ 17 (AFAIK)조차 가지고 있지 않습니다. .. 언젠가. 또한 왜 값을 OR하는 것이 아닌지는 명확하지 않습니다. '|'의 양쪽이 컴파일시의 상수 일 때, 컴파일러는 그것을 최적화 할 수 있고, 그것을 최적화 할 수 있습니다. – lorro

+0

'constexpr'을 사용해 보셨습니까? 또한 컴파일러가 어쨌든 컴파일 타임에 수학을 수행 할 수 있도록 'const'로 만들면 의심됩니다. – Galik

+0

좋은 점 @lorro와 Galik, 나는 컴파일러에 대한 믿음이별로 없다고 생각한다. – Kisss256

답변

3

이 표현 오타 (들)이 하나의 매개 변수) :

template <uint8_t mask> 
struct MaskAdd<mask> { .. }; 
+0

확인 됨. 바보 같은 오타를 유감스럽게 생각합니다. 전문화 구문은 내가 조사해야 할 부분입니다. – Kisss256

+0

어떻게이 솔루션을 확장하여 다른 유형을 처리 할 수 ​​있지만 여전히 동일한 'MaskAdd :: value' 구문을 사용합니까? – Kisss256

+0

@ Kisss256 [그것을] (http://coliru.stacked-crooked.com/a/2cc09e46cb6a914c)처럼 만들었습니다. 당신은'class'를 사용하여 그것을 할 수 있지만, 그 타입은 첫 번째 매개 변수가 될 필요가 있습니다. 'constexpr'을 들여다 보면 더 좋을 것입니다. – LogicStuff