[Development] How to include Standard Library headers from Qt ones?

Marc Mutz marc.mutz at kdab.com
Sun Apr 16 21:08:44 CEST 2017


On 2017-04-16 20:54, Ville Voutilainen wrote:
> On 16 April 2017 at 20:51, Giuseppe D'Angelo 
> <giuseppe.dangelo at kdab.com> wrote:
>> Il 16/04/2017 18:32, Corentin ha scritto:
>>> 
>>> More on point:
>>>    * You don't actually need to include anything from the STL to
>>> implement std::hash.
>> 
>> You actually do: you need <functional> to see the primary template for
>> std::hash (otherwise you can't specialize it). Also, how to implement 
>> it
>> is another burden (see the other discussion).
> 
> You don't need to include a header to do that:
> 
> namespace std {
>     template <class T> struct hash;
> }
> 
> Now you can specialize hash for your own types.
> 
> I don't think that violates any rule; it's not adding a declaration to
> namespace std, as that
> declaration is already there.

Does the standard guarantee that this is the declaration for std::hash? 
For vector etc, implementations are allowed to add extra, defaulted 
template arguments. If an implementation makes use of that, e.g. to have 
a void slot there for SFINAE, then the above declaration is wrong.

Also, it's not enough to have a std::hash primary template; you also 
need the std::hash specialisations for built-in (and enum) types, 
otherwise yoou may end up with "specialised after instantiation" errors, 
though that could be worked around by making std::hash<X>::op() a 
template. I use that trick already for std::hash<QSizePolicy>, to pick 
up any constexpr the underlying std::hash specialisation may provide.

Thanks,
Marc




More information about the Development mailing list