Rumah > pembangunan bahagian belakang > C++ > Bolehkah Tuples Berfungsi dengan Bekas Tidak Teratur Tanpa Templat Variadik dalam C 0x?

Bolehkah Tuples Berfungsi dengan Bekas Tidak Teratur Tanpa Templat Variadik dalam C 0x?

Susan Sarandon
Lepaskan: 2024-11-12 01:16:03
asal
972 orang telah melayarinya

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

Membuat Tuple C 0x Berfungsi dengan Bekas Tidak Tersusun

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?

Penyelesaian Standard

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&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;                                 
        }                                              
    };
}
Salin selepas log masuk

Menggunakan Ruang Nama Tersuai

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&amp; tt) const
    {                                              
        return std::hash<TT>()(tt);                                 
    }                                              
};
}

// ... Include the rest of the previous generic hash function code
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan