Cette question a été étiquetée comme C++ trop, voici donc une solution pour modèle la métaprogrammation les amateurs comme moi.
Exigences
- Un typelist type, nommé
list
ici.
- Un Haskell-comme
filter
metafunction.
- Un
head
metafunction pour obtenir le premier élément d'un typelist.
Le code
Cette solution automatise la solution retenue (ce Qui est juste "aller à l' stdint.h
et de choisir le plus adéquat pour vous"). Ce travail pourrait être fait par le compilateur, ne pourrait-elle pas?
D'abord la liste de toutes les plate-forme spécifique plus rapide des types d'entiers a déclaré à l' <cstdint>
:
using integer_types = list<std::int_fast8_t,std::int_fast16_t,
std::int_fast32_t,std::int_fast64_t>;
Notez que la liste est classée par l'augmentation de nombre entier de taille.
Définir un filtrage du prédicat. Dans notre cas, la taille doit être inférieure à la taille spécifiée par l'utilisateur (nom, il SIZE
):
template<typename T>
using f = std::integral_constant<bool,sizeof(T)*CHAR_BITS <= SIZE>;
Et puis filtrer la liste des types d'entiers et d'obtenir le premier élément de la suite:
using best_integer_t = head<filter<f,integer_types>>;
Résumé de la solution
template<std::size_t SIZE>
struct fastest_integer_impl
{
//Guard for the case the user specified less than one byte size:
static constexpr const std::size_t size = SIZE >= CHAR_BITS ? size : CHAR_BITS;
using integer_types = list<std::int_fast8_t,std::int_fast16_t,
std::int_fast32_t,std::int_fast64_t>;
template<typename T>
using f = std::integral_constant<bool,sizeof(T)*CHAR_BITS <= size>;
using type = head<filter<f,integer_types>>;
};
template<std::size_t SIZE>
using fastest_integer = typename fastest_integer_impl<SIZE>::type;