Sie können mehr nicht-Typ Template-Parameter zu „simulieren“ zusätzliche Bits:
// 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 } ;
};
Sie diese nach wie vor verwenden können, zum Beispiel:
binary<1001101>::value
Sie können aber auch die folgenden Befehle verwenden äquivalente Formen:
binary<100,1101>::value
binary<1001,101>::value
binary<100110,1>::value
Grundsätzlich sind die zusätzlichen Parameter geben Ihnen weitere 20 Bits zu spielen. Sie könnten bei Bedarf noch weitere Parameter hinzufügen.
Da der Stellenwert der zweiten Zahl verwendet wird, um herauszufinden, wie weit nach links die erste Zahl verschoben werden muss, muss die zweite Zahl mit einer 1 beginnen. (Dies ist ohnehin erforderlich, da sie mit a beginnt 0 würde dazu führen, dass die Zahl als Oktalzahl interpretiert wird.
)
Die Grenze von 20 ist wahrscheinlich Compiler abhängig. Es hängt davon ab, wie viel Template-Rekursion es tolerieren wird. Bei einigen modernen Compilern können Sie ein Argument übergeben, um die maximale Template-Rekursionstiefe festzulegen. –
Ich dachte, dass das Limit auf die Anzahl der Dezimalziffern zurückzuführen ist, die Sie in einem unsigned long long speichern könnten, da es im Grunde genommen die * dezimale * Zahl 101011011 nimmt und diese in eine binäre Zahl umwandelt, ja? – paxdiablo
Pax: Ja, zumindest für GCC, die ich benutze. – Unknown