Boost logo

Boost :

From: Daniel Frey (daniel.frey_at_[hidden])
Date: 2002-06-24 10:21:12

Kostya Altukhov wrote:
> Daniel Frey wrote:
> >This allows using sizeof_array safely, as it doesn't compile for
> >non-arrays. The only potential drawback I found is, that it's use is a
> >bit more complicated for static evaluation and sometimes, you need
> >typeof (hopefully in the next standard!?).
> >
> You can use the following trick:
> template<typename T, size_t N>
> const char (&sizer(const T (&)[N])) [N];

Interesting idea, but what compiler are you using? For me (gcc 2.95.2),
this doesn't work. I compiled:

#include <iostream>
using namespace std;

template< typename T, size_t N >
const char (&sizer(const T(&)[N]))[N];

int main()
   double x[] = { 1, 2, 3, 4, 5, 6 };
   typedef int X[42];

   enum {
      V1 = sizeof( sizer(X) ), // line 13, see below
      V2 = sizeof( sizer(x) )

   cout << V1 << endl
        << V2 << endl;

and got: parse error before `)'

Which seems logical to me, as sizer is a function and you can't call a
function with a type as a parameter like you did. Or did I missed
something? I tried to merge the code, but even the (more useful) second
example doesn't work for me, as

   V2 = sizeof( sizer(x) )

couldn't deduce the parameters. It worked, when I wrote:

   V2 = sizeof( sizer< double, 6 >(x) )

which is rather pointless. Is this because of my compiler being too old?
Does the standard require a conforming compiler to be able to deduce the
parameters in this case?

Regards, Daniel

Daniel Frey
aixigo AG - financial training, research and technology
Schloß-Rahe-Straße 15, 52072 Aachen, Germany
fon: +49 (0)241 936737-42, fax: +49 (0)241 936737-99
eMail: daniel.frey_at_[hidden], web:

Boost list run by bdawes at, gregod at, cpdaniel at, john at