Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menggunakan `decltype` dengan Fungsi Templat Variadik untuk Menjumlahkan Argumen?
Menggunakan decltype dengan Variadic Template Functions
Apabila cuba menulis fungsi variadic template yang mengembalikan jumlah dengan jenis yang sesuai menggunakan decltype, ia mungkin menghadapi beberapa isu yang tidak dijangka.
Masalahnya
Pada mulanya, fungsi diisytiharkan tanpa jenis pengembalian mengekori. Walau bagaimanapun, apabila diluluskan berbilang argumen, pengkompil mentafsirkan fungsi sebagai tidak ditentukan. Mengisytiharkan fungsi dengan jenis pengembalian mengekor menyelesaikan isu untuk lebih daripada dua argumen tetapi menghasilkan jenis pulangan yang salah untuk argumen jenis yang berbeza.
Isunya
decltype ialah tidak dapat menyimpulkan jenis t sum(p...) untuk lebih daripada dua argumen kerana templat fungsi variadik hanya diisytiharkan selepas jenis pulangan ditentukan.
Penyelesaian
Untuk mengelakkan panggilan rekursif dalam decltype ini, kelas ciri tersuai boleh digunakan. Kelas sum_type menentukan jenis jumlah untuk berbilang argumen tanpa memerlukan potongan rekursif.
Kod Kemas Kini
Ganti decltype dalam program anda dengan typename sum_type
#include <iostream> #include <type_traits> using namespace std; 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... > {};
Kaedah ini mengembalikan decltype((a b) c) dan bukannya decltype(a (b c)). Untuk hasil decltype(a (b c) yang lebih tepat), ubah suai pengkhususan terakhir seperti berikut:
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
Atas ialah kandungan terperinci Bagaimana untuk Menggunakan `decltype` dengan Fungsi Templat Variadik untuk Menjumlahkan Argumen?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!