⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 portability.qbk

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 QBK
字号:
[/ Copyright 2005-2008 Daniel James. / Distributed under the Boost Software License, Version 1.0. (See accompanying / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ][section:portability Portability][def __boost_hash__ [classref boost::hash]]__boost_hash__ is written to be as portable as possible, but unfortunately, severalolder compilers don't support argument dependent lookup (ADL) - the mechanismused for customisation.  On those compilers custom overloads for `hash_value`needs to be declared in the boost namespace.On a strictly standards compliant compiler, an overload defined in theboost namespace won't be found when __boost_hash__ is instantiated,so for these compilers the overload should only be declared in the samenamespace as the class.Let's say we have a simple custom type:    namespace foo    {        template <class T>        class custom_type        {            T value;        public:            custom_type(T x) : value(x) {}            friend std::size_t hash_value(custom_type x)            {                __boost_hash__<int> hasher;                return hasher(x.value);            }        };    }On a compliant compiler, when `hash_value` is called for this type,it will look at the namespace inside the type and find `hash_value`but on a compiler which doesn't support ADL `hash_value` won't be found.To make things worse, some compilers which do support ADL won't finda friend class defined inside the class.So first move the member function out of the class:    namespace foo    {        template <class T>        class custom_type        {            T value;        public:            custom_type(T x) : value(x) {}            std::size_t hash(custom_type x)            {                __boost_hash__<T> hasher;                return hasher(value);            }        };        template <class T>        inline std::size_t hash_value(custom_type<T> x)        {            return x.hash();        }    }Unfortunately, I couldn't declare hash_value as a friend, as some compilersdon't support template friends, so instead I declared a member function tocalculate the hash, and called it from hash_value.For compilers which don't support ADL, hash_value needs to be defined in theboost namespace:    #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP    namespace boost    #else    namespace foo    #endif    {        template <class T>        std::size_t hash_value(foo::custom_type<T> x)        {            return x.hash();        }    }Full code for this example is at[@../../libs/functional/hash/examples/portable.cpp /libs/functional/hash/examples/portable.cpp].[h2 Other Issues]On Visual C++ versions 6.5 and 7.0, `hash_value` isn't overloaded for built inarrays. __boost_hash__, [funcref boost::hash_combine] and [funcref boost::hash_range] all use a workaround tosupport built in arrays so this shouldn't be a problem in most cases.On Visual C++ versions 6.5 and 7.0, function pointers aren't currently supported.When using GCC on Solaris, `boost::hash_value(long double)` treats`long double`s as `double`s - so the hash function doesn't take into account thefull range of values.[endsect]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -