Boost logo

Boost :

Subject: Re: [boost] [chrono/date] year/day/week literals
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2013-05-04 08:31:40


Le 03/05/13 18:12, TONGARI a écrit :
> 2013/5/3 Vicente J. Botet Escriba <vicente.botet_at_[hidden]>
>
>> Le 03/05/13 16:04, TONGARI a écrit :
>>
>>> 2013/5/3 Vicente J. Botet Escriba <vicente.botet_at_[hidden]>
>>>
>>> Le 03/05/13 12:01, Vicente J. Botet Escriba a écrit :
>>>> Hi,
>>>>
>>>>> on the GSoC discussion about Boost.Chrono/Date proposal we were
>>>>> discussing about date construction.
>>>>> Some of us think that we need to use named types for day, month, year
>>>>> and
>>>>> week so that the date constructors are not ambiguous.
>>>>> Everyone agree with the constant object for month.
>>>>>
>>>>> date dt(year(2013), may, day(3));
>>>>>
>>>>> But having to use day(3) or year(2013) seems to wordy.
>>>>>
>>>>> I was wondering if we can not add some literals for day, year and week
>>>>> so
>>>>> that we can just write
>>>>>
>>>>> date dt(2013y, may, 3d);
>>>>>
>>>>> The advantage I see in addition to been less wordy, is that we will have
>>>>> a compile error when the year, day or week is out of range.
>>>>>
>>>>> Oh I forget the drawbacks. As any other suffix it would need to add a
>>>>>
>>>> using statement
>>>>
>>>> using boost::chrono::dates::****literals;
>>>>
>>>>
>>>> date dt(2013y, may, 3d);
>>>>
>>>> Are any standardized suffixes for day,week and year? Note that these are
>>>> not the same as days, years, weeks.
>>>>
>>>> Hmm, a user literal must start with '_', isn't it?
>> date dt(2013_y, may, 3_d);
>>
>>
>>
>>> My personal favor is that just one ctor in YMD order, so I won't need the
>>> literals, it's a programming style matter after all...
>>>
>>>
>>> You can the use
>> date dt(2013, may, 3, no_check);
>
> IMHO, some static member functions would be simple and elegant (to me)
>
> date::ymd, date::mdy, date::dmy
After addition of some constructors you will be able create an unchecked
date by typing only

  date dt(2013, may, day(3), no_check);
  date dt(2013, may, 3_d, no_check);

or

  date dt(year(2013), may, 3, no_check);
  date dt(2013_y, may, 3, no_check);

or

  date dt(no_check, 2013, may, 3);
  date dt(no_check, 2013, 5, 3);

Is this satisfactory for you?
>
> What Howard Hinnant had proposed may be a bonus to have
>
> date d = year(2013) / month(5) / day(3);
>
> But to be frankly with you, I'd like to save some typing.
>
You have always the option

  date dt(no_check, 2013, may, 3);

BTW, maybe we can change no_check by no_throw as this constructor will
not throw even if the date is invalid. Of course it is UB if the date is
invalid.

  date dt(no_throw, 2013, may, 3);

Best,
Vicente


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