https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61166
--- Comment #7 from Kan Liu <kan.liu.229 at gmail dot com> ---
(In reply to emsr from comment #6)
> Something like parse_number was in the original doc as an implementation
> example. The idea was to select the smallest integral type that could
> accommodate the number string with. This is done with _Select_int.
> _Select_type picks the most space-efficient duration ratio type using
> _Select_int.
Yeah, but it only helps saving space when compiling time for now. For now
implementation, _Select_type takes the default chrono::hour (and other time
units), which uses *int64_t* as its underlying representation. So, it doesn't
save space I think.
Take *ms* as example
Implementation now:
template <char... _Digits>
constexpr typename
__select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
chrono::milliseconds>::type
operator""ms()
{
return __select_type::_Select_type<
__select_int::_Select_int<_Digits...>::value,
chrono::milliseconds>::value;
}
space-efficient version (maybe), get the type from _Select_int:
template <char... _Digits>
constexpr typename
chrono::duration<decltype(__select_int::_Select_int<_Digits...>::value), milli>
operator""_ms()
{
typedef typename __select_int::_Select_int<_Digits...> __selected;
typedef typename chrono::duration<decltype(__selected::value), milli>
__duration_type;
return __duration_type {__selected::value};
}