Le 04/05/13 03:30, Rob Stewart a écrit :
On May 3, 2013, at 9:30 AM, "Vicente J. Botet Escriba"
wrote: Le 03/05/13 13:52, Rob Stewart a écrit :
On May 3, 2013, at 3:47 AM, "Vicente J. Botet Escriba"
wrote: You can even handle other orders that way:
date(month, unsigned, year); date(month, day, unsigned); date(unsigned, day, month); date(year, unsigned, month);
One can also be explicit for both day and year:
date(year, month, day); date(month, day, year); date(day, month, year); date(day, year, month); I don't think that the constructor should support different orderings. It could, easily, so why not? Different locales have different preferred orderings. All can learn to use the descending magnitude order, but a little flexibility, without ambiguity, would be nice.
I'm assuming explicit constructors for day and year, of course. Of course. And implicit conversion to his representation, so that
date(2013, may, 3, no_check)
is yet valid. That's where I disagree. If you have explicit constructors for year and day, and no constructor accepting two ::rep arguments, then your example won't compile.
That's also what enables support for other argument orders. The no_check constructor allows only year,month,day order of arguments. If the user know that the date is valid it can know the order. This is a low level function. I'm talking of possibilities, not about an existing design. In the US, we write dates in a way that everyone else thinks is weird: month/day/year. A constructor taking three integral arguments will be a stumbling block for US users. We can, of course, learn the right order, but I guarantee that many -- me, certainly -- will find it necessary to consult the docs every time, if there's more than a fortnight between uses of that constructor. Even if it were validated, not all misuses can be detected.
Using typed arguments, despite the added verbosity, solves that, though probably at the expense of all of those who only think of YMD order. That's also why I suggested all of the constructor possibilities above.
I understand your concern. There are some that are requesting a constructor as simple as date(int y, int m, int d); that presumes the values given stand for a valid date. Others want the C++ type system helps them as much as possible. Would the following be enough satisfactory Taking in account only the ymd constructors // date validaty check date(year, month, day); date(year, month, int); date(year, int, day); date(int, month, day); // no date validity check date(year, month, day, no_check_t); date(year, month, int, no_check_t); date(year, int, day, no_check_t); date(int, month, day, no_check_t); // no date validity check parameters are in ymd orther. date(int y, int m, int d, ymd_t); Note the last one has the no_check before to avoid ambiguity as all year, month and day are convertible to int. I'm of course open to better names for no_check_t and ymd_t.
We could have a factory make_date function that doesn't checks the validity of the date and avoids the no_check parameter
make_ymd_date(2013, may, 3) I don't understand what no_check has to do with such a function. Add an overload that accepts no_check_t to get that. The name is not the good one.
make_unchecked_date(2013, may, 3); or
make_valid_date(2013, may, 3); make_date(year(2013), may, 3) works just as well and can be overloaded for other orders.
You could add overloads that take no_check_t (or, maybe, unvalidated_t), or just create a similar set of overloads of your make_unvalidate_date().
If I understand you make_date would behave as the / factory and is useful for those that don't like the / factory syntax. make_unvalidate_date() would use the no_check_t overloads. Both would have the same set of of overload orders. I would prefer to let pending these factory discussion. We could come back once we agree on the date constructors. Best, Vicente