Boost logo

Boost :

From: Gennaro Prota (gennaro_prota_at_[hidden])
Date: 2006-06-25 14:01:09


On Sun, 25 Jun 2006 13:11:32 -0400, me22 <me22.ca_at_[hidden]> wrote:

>On 6/25/06, Gennaro Prota <gennaro_prota_at_[hidden]> wrote:
>> Yes, of course. I've reattached an implementation I proposed here a
>> couple of years ago. The reason why I'm asking is basically that it
>> would require some "somersault" to make it work with VC6 and other
>> broken compilers, so I woldn't spend time on that if there is no
>> interest.
>>
>The attachment didn't come out properly for me.

Here's it, copy-and-pasted:

// -- array_counter.hpp --
//
// (C) Gennaro Prota 2004
//
// Use, modification, and distribution is subject to the Boost
Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or
copy
// at http://www.boost.org/LICENSE_1_0.txt)
//
// -------------------------------------------

#ifndef MAYBE_BOOST_ARRAY_COUNTER_HPP_GP_20040130
#define MAYBE_BOOST_ARRAY_COUNTER_HPP_GP_20040130

#include <cstddef>

namespace maybe_boost {

    template <std::size_t, typename>
    struct count_dim;

    template <std::size_t dim, typename T, std::size_t n>
    struct count_dim<dim, T[n]>
    {
        static const std::size_t value = count_dim<dim-1, T>::value;
    };

    template <typename T, std::size_t n>
    struct count_dim<0, T[n]>
    {
        static const std::size_t value = n;
    };

    template <std::size_t dim, typename T, std::size_t n>
    char (&array_count(T(&)[n])) [count_dim<dim, T[n]>::value];

}

#endif // include guard

>
>I think it's worth including. It's not all that uncommon; even
>Freenode/##C++'s channel bot has the following factoid:
>Don't use sizeof() to get the size of an array, because sizeof() will
>do the wrong thing if that 'array' is actually a pointer. Use the
>following instead: template <typename T, size_t N> size_t array_size(T
>(&)[N]) { return N; }

That one has the advantage that it can be used without sizeof, but
can't be used in constant expressions. My version is exactly the
opposite in terms of pros/cons. Of course one can define a macro:

#define BOOST_ARRAY_COUNT(a) ( sizeof array_count<0>(a) )
#define BOOST_ARRAY_COUNT_DIM(a, d) ...

>Of course that one only works for the outermost dimension of the array
>and I have no idea whether it works in VC6 at all.

Oh, it doesn't :) Not even if you limit to one dimension. Even in that
case it can't understand T(&)[N] and deduce T and N from that. But I'm
not sure we should support VC6 more than with a sizeof/sizeof
"fallback" version.

BTW, I would like to make this work for std::tr1::array as well.

--Gennaro.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk