>  기사  >  백엔드 개발  >  C 0x에서 가변 템플릿 없이 순서가 지정되지 않은 컨테이너에서 튜플을 사용할 수 있나요?

C 0x에서 가변 템플릿 없이 순서가 지정되지 않은 컨테이너에서 튜플을 사용할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-12 01:16:03928검색

Can Tuples Work with Unordered Containers Without Variadic Templates in C  0x?

C 0x 튜플을 순서가 지정되지 않은 컨테이너와 함께 작동하도록 만들기

튜플 키를 사용하여 순서가 지정되지 않은 맵과 집합을 만드는 것은 간단해야 하지만 튜플에 대한 사용자 정의 해시 함수를 요구하는 것은 지루할 수 있습니다. 하지만 가변 템플릿을 사용하지 않고 이를 피할 수 있는 방법이 있나요?

표준 솔루션

C 0x에서는 아래 코드를 사용하여 튜플에 대한 일반 해시 함수를 정의할 수 있습니다.

namespace std{
    namespace
    {
        // Code from boost
        // Reciprocal of the golden ratio helps spread entropy
        //     and handles duplicates.
        // See Mike Seymour in magic-numbers-in-boosthash-combine:
        //     http://stackoverflow.com/questions/4948780

        template <class T>
        inline void hash_combine(std::size_t&amp; seed, T const&amp; v)
        {
            seed ^= std::hash<T>()(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
        }

        // Recursive template code derived from Matthieu M.
        template <class Tuple, size_t Index = std::tuple_size<Tuple>::value - 1>
        struct HashValueImpl
        {
          static void apply(size_t&amp; seed, Tuple const&amp; tuple)
          {
            HashValueImpl<Tuple, Index-1>::apply(seed, tuple);
            hash_combine(seed, std::get<Index>(tuple));
          }
        };

        template <class Tuple>
        struct HashValueImpl<Tuple,0>
        {
          static void apply(size_t&amp; seed, Tuple const&amp; tuple)
          {
            hash_combine(seed, std::get<0>(tuple));
          }
        };
    }

    template <typename ... TT>
    struct hash<std::tuple<TT...>> 
    {
        size_t
        operator()(std::tuple<TT...>&amp; tt) const
        {                                              
            size_t seed = 0;                             
            HashValueImpl<std::tuple<TT...>>::apply(seed, tt);    
            return seed;                                 
        }                                              
    };
}

사용자 정의 네임스페이스 사용

표준 준수를 보장하려면 다음을 정의하는 것이 좋습니다. 사용자 정의 네임스페이스의 튜플에 대한 해시 함수를 사용하여 ADL이 자동으로 선택하는 것을 방지합니다. 이를 위해서는 먼저 사용자 정의 네임스페이스에서 해시 구현을 선언한 다음 나머지 일반 해시 함수 코드를 포함해야 합니다.

namespace hash_tuple{

template <typename TT>
struct hash
{
    size_t
    operator()(TT const&amp; tt) const
    {                                              
        return std::hash<TT>()(tt);                                 
    }                                              
};
}

// ... Include the rest of the previous generic hash function code

이렇게 하면 순서가 지정되지 않은 맵과 세트가 ADL에 의존하지 않고 튜플 키와 함께 작동할 수 있습니다. 표준을 완벽하게 준수합니다.

위 내용은 C 0x에서 가변 템플릿 없이 순서가 지정되지 않은 컨테이너에서 튜플을 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.