Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah jenis pulangan mengekor boleh digunakan dengan fungsi templat variadic untuk menyimpulkan jenis pulangan yang betul untuk fungsi yang menjumlahkan hujah pelbagai jenis?
Jenis Pulangan Mengekor Menggunakan Dectype dengan Fungsi Templat Variadik
Apabila cuba mencipta fungsi templat variasi yang menjumlahkan hujah pelbagai jenis dan pulangan jumlah yang ditaip dengan betul, isu biasa timbul.
Perumusan Masalah
Pelaksanaan asas menggunakan decltype sebagai jenis pengembalian mengekor mengakibatkan tingkah laku yang tidak ditentukan untuk argumen yang melebihi dua. Untuk mengelakkan ini, fungsi boleh diisytiharkan secara eksplisit, tetapi ini membawa kepada potongan jenis yang salah untuk berbilang argumen.
Penyelesaian Menggunakan Kelas Ciri Tersuai
Untuk mengatasi isu ini, kelas ciri tersuai yang dipanggil sum_type digunakan. Ia secara rekursif mengira jenis pulangan menggunakan std::add_rvalue_reference dan std::val.
template<class T, class... P> struct sum_type; template<class T> struct sum_type<T> : id<T> {}; template<class T, class U, class... P> struct sum_type<T,U,P...> : sum_type< decltype( val<const T&>() + val<const U&>() ), P... > {};
Pelaksanaan Diubahsuai
Dengan menggantikan decltype dengan typename sum_type
template <class T, class... P> auto sum(const T& t, const P&... p) -> typename sum_type<T,P...>::type { return t + sum(p...); }
Potongan Jenis Yang Diperbaiki
Selain itu, pengubahsuaian kepada pengkhususan terakhir sum_type menyediakan potongan jenis yang dipertingkatkan:
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
Ini memastikan bahawa jenis pemulangan sepadan dengan decltype(a (b c)), sejajar dengan susunan tambahan yang dijangkakan.
Atas ialah kandungan terperinci Bagaimanakah jenis pulangan mengekor boleh digunakan dengan fungsi templat variadic untuk menyimpulkan jenis pulangan yang betul untuk fungsi yang menjumlahkan hujah pelbagai jenis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!