Ich habe eine Reihe von Bitmasken hinzufügen (Schicht, logische OR |
), aber wie sie Konstanten sind möchte ich dies zur Kompilierzeit tun. Die Eingabe erweitert Vorlage Gebiets ...C++ Kompilierzeit Bitmaske Addition
Ich versuchte Rekursion:
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;
};
, die folgenden Fehler gab:
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 {
^
ich diese seltsame Syntax auch versucht, durch (vermutlich) ein Missverständnis der cppreference Seite auf parameter packs:
template <uint8_t...masks>
struct MaskAdd {
static const uint8_t value = (masks | ...);
};
, die diese Fehler warf:
file.cpp:3:43: error: expected primary-expression before ‘...’ token
static const uint8_t value = (masks | ...);
^
file.cpp:3:43: error: expected ‘)’ before ‘...’ token
ich in der template<template<
Region der Hölle irgendwo haben, ist die Lösung für ein Gefühl, wenn jemand diejenigen erklären kann ich dankbar sein würde.
Letzteres (Masken | ...) ist derzeit nicht einmal C++ 17 (AFAIK), es gibt große Hoffnungen, es zu bekommen .. irgendwann. Es ist auch nicht klar, warum Sie nicht nur die Werte ODER. Wenn beide Seiten von '|' Kompilierzeitkonstanten sind, kann und wird der Compiler es optimieren. – lorro
Haben Sie 'constexpr' versucht? Ich vermute auch, wenn Sie sie nur "const" machen, wird der Compiler die Mathematik sowieso zur Kompilierzeit tun. – Galik
Gute Punkte @lorro und Galik, ich glaube, ich habe nicht so viel Vertrauen in den Compiler. – Kisss256