Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Portability

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 14. Boost.Functional/Hash

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

<boost::hash>написан так, чтобы быть максимально портативным, но, к сожалению, несколько старых компиляторов не поддерживают основанный на аргументах поиск (ADL) - механизм, используемый для настройки. На этих компиляторах пользовательские перегрузки для<hash_value>должны быть объявлены в пространстве имен повышения.

На компиляторе, соответствующем строгим стандартам, перегрузка, определенная в пространстве имен бустера, не будет найдена, когда<boost::hash>инстанцируется, поэтому для этих компиляторов перегрузка должна быть объявлена только в том же пространстве имен, что и класс.

Допустим, у нас есть простой пользовательский тип:

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);
        }
    };
}

На совместимом компиляторе, когда<hash_value>вызывается для этого типа, он будет смотреть на пространство имен внутри типа и находить<hash_value>, но на компиляторе, который не поддерживает ADL<hash_value>, не будет найден. Что еще хуже, некоторые компиляторы, которые поддерживают ADL, не найдут класс друзей, определенный внутри класса.

Итак, сначала выведите функцию члена из класса:

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();
    }
}

К сожалению, я не мог объявить хэш_значение другом, поскольку некоторые компиляторы не поддерживают друзей шаблона, поэтому вместо этого я объявил функцию участника для вычисления хэша и назвал ее из хэш_значения.

Для компиляторов, которые не поддерживают ADL, значение хэш_ должно быть определено в пространстве имен импульса:

#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();
    }
}

Полный код для этого примера находится по адресу/libs/functional/hash/examples/portable.cpp.


PrevUpHomeNext

Статья Portability раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 14. Boost.Functional/Hash может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 14. Boost.Functional/Hash ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 16:30:28/0.006199836730957/0