Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menggunakan `decltype` dengan Fungsi Templat Variadik untuk Menjumlahkan Argumen?

Bagaimana untuk Menggunakan `decltype` dengan Fungsi Templat Variadik untuk Menjumlahkan Argumen?

Mary-Kate Olsen
Lepaskan: 2024-11-13 04:48:02
asal
891 orang telah melayarinya

How to Use `decltype` with Variadic Template Functions to Sum Arguments?

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::type seperti yang ditunjukkan:

#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&amp;>() + val<const U&amp;>() ), P... > {};
Salin selepas log masuk

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>()
)>{};
Salin selepas log masuk

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!

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