Ich möchte eine Template-Funktion implementieren, die Bitmasken in Kompilierzeit für ganzzahlige Typen generiert. Diese Masken sollten auf 8-Bit-Mustern basieren, wobei das Muster fortlaufend wiederholt wird, um die ganze Zahl zu füllen. Das folgende Beispiel macht genau das, was ich will, aber in Laufzeit:Erstellen einer Bitmaske basierend auf einem Muster als consExpr
#include <iostream>
#include <type_traits>
#include <cstring>
template<typename Int>
typename std::enable_if<std::is_integral<Int>::value, Int>::type
make_mask(unsigned char pattern) {
Int output {};
std::memset(&output, pattern, sizeof(Int));
return output;
}
int main() {
auto mask = make_mask<unsigned long>(0xf0);
std::cout << "Bitmask: '" << std::hex << mask << "'" << std::endl;
}
Der Ausgang des Code oben ist:
Bitmask: 'f0f0f0f0f0f0f0f0'
Ich weiß, dass das Optimierungsprogramm den gesamten Funktionsaufruf im Code beseitigen oben, aber ich suche nach einer constexpr
Lösung mit c++14 und wahlweise mit c++11.
Ihr Beispiel funktioniert auch mit 'C++ 98'. Ich denke, der 'byte_repeater' ist nicht notwendig, sein' count' Parameter in der primären Vorlage kann initialisiert werden als 'count = sizeof (Int)' dann kann der 'byte_repeater' genauso verwendet werden wie' make_mask' wenn der 'count 'ist der letzte Parameter. Dennoch ist es ein guter Punkt, separate Vorlagen zu machen, um den "count" -Parameter zu verstecken, der nur ein Implementierungsdetail ist. – Akira
Trotz der anderen Antworten war auch hilfreich und schwer zu wählen, die zu akzeptieren, akzeptiere ich diese aus Gründen der Rückwärtskompatibilität. – Akira