Walaupun membuat peta dan set tidak tersusun menggunakan kekunci tuple haruslah mudah, memerlukan fungsi cincang tersuai untuk tupel boleh membosankan. Tetapi adakah terdapat cara untuk mengelakkan ini tanpa menggunakan templat variadic?
Dalam C 0x, fungsi cincang generik untuk tupel boleh ditakrifkan menggunakan kod di bawah:
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; } }; }
Untuk memastikan pematuhan dengan standard, adalah disyorkan untuk menentukan fungsi cincang untuk tupel dalam ruang nama tersuai, menghalangnya daripada diambil secara automatik oleh ADL. Ini memerlukan pengisytiharan pelaksanaan cincang dalam ruang nama tersuai terlebih dahulu, diikuti dengan memasukkan kod fungsi cincang generik yang selebihnya:
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
Dengan cara ini, peta dan set tidak tersusun boleh berfungsi dengan kunci tuple tanpa bergantung pada ADL, dan piawaian itu dipatuhi sepenuhnya.
Atas ialah kandungan terperinci Bolehkah Tuples Berfungsi dengan Bekas Tidak Teratur Tanpa Templat Variadik dalam C 0x?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!