Vous pouvez ajouter des paramètres de modèle non-type de "simuler" bits supplémentaires:
// Utility metafunction used by top_bit<N>.
template <unsigned long long N1, unsigned long long N2>
struct compare {
enum { value = N1 > N2 ? N1 >> 1 : compare<N1 << 1, N2>::value };
};
// This is hit when N1 grows beyond the size representable
// in an unsigned long long. It's value is never actually used.
template<unsigned long long N2>
struct compare<0, N2> {
enum { value = 42 };
};
// Determine the highest 1-bit in an integer. Returns 0 for N == 0.
template <unsigned long long N>
struct top_bit {
enum { value = compare<1, N>::value };
};
template <unsigned long long N1, unsigned long long N2 = 0>
struct binary {
enum {
value =
(top_bit<binary<N2>::value>::value << 1) * binary<N1>::value +
binary<N2>::value
};
};
template <unsigned long long N1>
struct binary<N1, 0> {
enum { value = (N1 % 10) + 2 * binary<N1/10>::value };
};
template <>
struct binary<0> {
enum { value = 0 } ;
};
Vous pouvez l'utiliser comme avant, par exemple:
binary<1001101>::value
Mais vous pouvez aussi utiliser les éléments suivants formes équivalentes:
binary<100,1101>::value
binary<1001,101>::value
binary<100110,1>::value
Fondamentalement, le paramètre supplémentaire vous donne 20 autres bits à jouer avec. Vous pouvez ajouter encore plus de paramètres si nécessaire. Comme la valeur de position du second nombre est utilisée pour déterminer à quelle distance vers la gauche le premier nombre doit être décalé, le deuxième nombre doit commencer par un 1. (Ceci est nécessaire de toute façon, depuis le début avec un 0 ferait que le nombre soit interprété comme un nombre octal.)
La limite de 20 dépend probablement du compilateur. Cela dépend de la quantité de récursion que le modèle peut tolérer. Certains compilateurs modernes vous permettront de passer un argument pour définir la profondeur de récursivité maximale du modèle. –
Je pensais que la limite était due au nombre de chiffres décimaux que vous pourriez stocker dans un long sans signe, puisqu'il prend en gros le * décimal * numéro 101011011 et le transforme en binaire, oui? – paxdiablo
Pax: oui, au moins pour GCC que j'utilise. – Unknown