|
Boost : |
Subject: Re: [boost] [Better Enums] More complete release - feedback requested
From: Anton Bachin (antonbachin_at_[hidden])
Date: 2015-06-11 11:06:56
Thanks for the reply :)
> On Jun 11, 2015, at 09:46, Thorsten Ottosen <tottosen_at_[hidden]> wrote:
>
> On 11-06-2015 15:47, Anton Bachin wrote:
>
>>>> [snip]
>>>>
>>>>> B. make size a constexpr function
>>>
>>>
>>> +1
>>>
>>> I think you should look to the future and give pay-off to people using more
>>> modern C++. However you can macro-ize the constexpr keyword so that it is
>>> constexpr is supported or nothing if not.
>>>
>>> BOOST_NO_CXX11_CONSTEXPR will do the check for you.
>>
>> Iâve already done this, and I use it throughout enum.h. Itâs not a problem to
>> make a size() function constexpr only when supported, I am just not so
>> comfortable throwing away size as an integral constant for non-C++11 users.
>> Perhaps I can make size() a function and provide an alternative constant with an
>> ugly name for those who might need it? Do people still use C++03? And, again,
>> what is the rationale for size being a function?
>
> It's more generic if you want to view the class as a container with size() and begin()/end().
Better Enums is not the container, however. Itâs a class that provides access to
two containers, currently through _names() and _values(). Those containers do
have size() (a function), and begin()/end():
http://aantron.github.io/better-enums/ApiReference.html#Typedef_value_iterable
http://aantron.github.io/better-enums/ApiReference.html#Typedef_name_iterable
These are containers in the sense you mean, compatible with STL algorithms,
for-each loops, etc. I do value having size be a function for uniformity, so
that itâs not surprising that itâs a function in the containers, yet a constant
in the enum. Iâm leaning towards your suggestion, and providing a constant with
an alternative name for C++03 metaprogramming.
> Yes, people still used C++03, but I'm sure they can live with a non-constexpr size() that is every bit as fast at runtime as a constexpr one.
Well, the issue isnât runtime performance, itâs that you canât use the function
for some purposes before C++11. For example, only the first one works:
const int size = 3;
char *descriptions[size];
int size() { return 3; }
char *descriptions[size()];
I may be somehow wrong with this usage example. If so, please correct me.
Regards,
Anton
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk