Je voudrais implémenter une fonction template qui génère des masques de bits lors de la compilation pour les types entiers. Ces masques doivent être basés sur des motifs de 8 bits où le motif sera répété consécutivement pour remplir l'entier. L'exemple suivant fait exactement ce que je veux, mais en temps d'exécution:Créer un masque de bits basé sur un modèle comme constexpr
#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;
}
La sortie du code ci-dessus est:
Bitmask: 'f0f0f0f0f0f0f0f0'
Je sais que l'optimiseur peut éliminer l'ensemble de l'appel de fonction dans le code ci-dessus, mais je cherche une solution constexpr
avec c++14 et éventuellement avec c++11.
Votre exemple fonctionne également avec 'C++ 98'. Je pense que 'byte_repeater' n'est pas nécessaire, son paramètre' count' dans le template primaire peut être initialisé comme 'count = sizeof (Int)' alors le 'byte_repeater' peut être utilisé de la même manière que' make_mask' si le 'count 'est le dernier paramètre. Néanmoins, c'est un bon point de faire des modèles séparés pour cacher le paramètre 'count' qui n'est qu'un détail d'implémentation. – Akira
Malgré les autres réponses ont été utiles aussi et difficile de choisir celui à accepter, j'accepte celui-ci en raison de la rétrocompatibilité. – Akira