Jenis Pulangan Mengekor Menggunakan decltype dengan Fungsi Templat Variadik
Semasa cuba melaksanakan fungsi penambah asas yang mengumpul argumen dan mengembalikan jumlah dengan jenis yang sesuai, pengguna menghadapi masalah dengan ketidakupayaan pengkompil untuk menyimpulkan jenis pulangan dengan betul.
Coretan Kod:
template <class T, class P...> auto sum(const T& t, const P&... p) -> decltype(t + sum(p...)) { return t + sum(p...); }
Dengan kod di atas, pengkompil bergelut untuk menyelesaikan jenis pulangan apabila lebih daripada dua argumen terlibat. Untuk menangani perkara ini, pengguna mengubah suai pengisytiharan fungsi:
template <class T, class P...> T sum(const T& t, const P&... p);
Pengubahsuaian ini membetulkan isu tetapi memperkenalkan masalah lain: fungsi mengembalikan integer untuk argumen jenis campuran, yang tidak diingini.
Perbincangan dan Penyelesaian:
Masalah timbul kerana jenis trailing return menggunakan decltype hanya dianggap diisytiharkan selepas jenis pemulangan ditentukan. Walau bagaimanapun, dalam kes ini, jenis pemulangan bergantung pada panggilan rekursif kepada jumlah.
Untuk menyelesaikan masalah ini, kelas ciri tersuai diperkenalkan:
template<class T> typename std::add_rvalue_reference<T>::type val(); template<class T> struct id{typedef T type;}; 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... > {};
Dengan menggantikan decltype dengan typename sum_type< T,P...>::taip, isu telah diselesaikan. Sebagai alternatif, pengguna boleh mengubah suai pengkhususan terakhir kelas sum_type untuk memastikan perkaitan pengendali yang betul:
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
Dengan pengubahsuaian ini, fungsi penambah mengumpul argumen dengan tepat dan mengembalikan jumlah yang dijangkakan dengan jenis yang betul.
Atas ialah kandungan terperinci Bagaimanakah saya boleh memastikan potongan jenis pulangan yang betul dengan fungsi templat variadic menggunakan jenis pengembalian trailing dan `decltype`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!