A
andrey.vul
I'm tryin to convert this:
long sumOfBits(int n) {
long x = 0;
int i;
for (i = n - 1; i >= 0; i--)
x += (1 << i);
return x;
}
into something like this:
template <int n> struct sumOfBits {
static const unsigned char u8value = (unsigned char)((1 << n) +
sumOfBits<n - 1>::u8value);
static const unsigned __int16 u16value = (unsigned __int16)((1 << n)
+ sumOfBits<n - 1>::u16value);
static const unsigned __int32 u32value = (unsigned __int32)((1 << n)
+ sumOfBits<n - 1>::u32value);
static const unsigned __int64 u64value = (unsigned __int64)((1 << n)
+ sumOfBits<n - 1>::u64value);
};
template <> struct sumOfBits <0> {
static const unsigned char u8value = (unsigned char)1;
static const unsigned __int16 u16value = (unsigned __int16)1;
static const unsigned __int32 u32value = (unsigned __int32)1;
static const unsigned __int64 u64value = (unsigned __int64)1;
};
and so far, all expansions, that have multiples of 8 (8, 16, 32, 64)
return 0 due to overflow.
Any way to correctly rewrite the template?
long sumOfBits(int n) {
long x = 0;
int i;
for (i = n - 1; i >= 0; i--)
x += (1 << i);
return x;
}
into something like this:
template <int n> struct sumOfBits {
static const unsigned char u8value = (unsigned char)((1 << n) +
sumOfBits<n - 1>::u8value);
static const unsigned __int16 u16value = (unsigned __int16)((1 << n)
+ sumOfBits<n - 1>::u16value);
static const unsigned __int32 u32value = (unsigned __int32)((1 << n)
+ sumOfBits<n - 1>::u32value);
static const unsigned __int64 u64value = (unsigned __int64)((1 << n)
+ sumOfBits<n - 1>::u64value);
};
template <> struct sumOfBits <0> {
static const unsigned char u8value = (unsigned char)1;
static const unsigned __int16 u16value = (unsigned __int16)1;
static const unsigned __int32 u32value = (unsigned __int32)1;
static const unsigned __int64 u64value = (unsigned __int64)1;
};
and so far, all expansions, that have multiples of 8 (8, 16, 32, 64)
return 0 due to overflow.
Any way to correctly rewrite the template?