튜플 키를 사용하여 순서가 지정되지 않은 맵과 집합을 만드는 것은 간단해야 하지만 튜플에 대한 사용자 정의 해시 함수를 요구하는 것은 지루할 수 있습니다. 하지만 가변 템플릿을 사용하지 않고 이를 피할 수 있는 방법이 있나요?
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& seed, T const& 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& seed, Tuple const& 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& seed, Tuple const& tuple) { hash_combine(seed, std::get<0>(tuple)); } }; } template <typename ... TT> struct hash<std::tuple<TT...>> { size_t operator()(std::tuple<TT...>& 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& tt) const { return std::hash<TT>()(tt); } }; } // ... Include the rest of the previous generic hash function code
이렇게 하면 순서가 지정되지 않은 맵과 세트가 ADL에 의존하지 않고 튜플 키와 함께 작동할 수 있습니다. 표준을 완벽하게 준수합니다.
위 내용은 C 0x에서 가변 템플릿 없이 순서가 지정되지 않은 컨테이너에서 튜플을 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!