Re: SOLUTION: compile time array size using type only
Thomas Maeder wrote:
"dmitry.sychov@mail.ru" <dmitry.sychov@mail.ru> writes:
here is the way for finding array size using type only
////////
template<class T> class cx_array_length {
template <class T, unsigned N> static inline const char
(&_bounds_fn(const T (&)[N]))[N];
static const T * _arr;
public:
enum { value = sizeof(_bounds_fn(*_arr)) }; };
int length = cx_array_length<char[3]>::value;
//////////
the question is: is the compiler is smart enough not to put
"_arr" into the compiled object?
If I understand the standard correctly, it isn't allowed to
instantiate the definition (and couldn't if it was, since you
haven't provided a definition) unless you use it.
if you have better solutions/any ideas please share
What about:
template <typename T>
class cx_array_length
{
enum
{
value = 1
};
};
template <typename T, unsigned N>
struct cx_array_length<T[N]>
{
enum
{
value = N
};
};
But what's the point. In both cases, in order to instantiate
the template, you have to specify the type, to specify the type,
you have to specify the size literally, and if you know the
size, it's much easier to write just:
int length = 3 ;
than
int length = cx_array_length< int[ 3 ] >::value ;
Or is there something here that I've missed?
We (you and I) recently did something more useful in
de.comp.lang.iso-c++, if I recall correctly:
template< typename N, size_t N >
char (&array_size( T (&array)[ N ] ))[ N ] ;
which allows writing things like:
double someArray[] = { 0.1, 0.2, 0.5, 1.0 } ;
int length = sizeof( array_size( someArray ) ) ;
Obviously, the problem is even easier if you don't require a
constant integral expression.
--
James Kanze GABI Software
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]