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
Mary-Kate Olsenasal
2024-11-13 04:48:02881semak imbas

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... > {};

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!

Kenyataan:
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