Bagaimanakah saya boleh memastikan potongan jenis pulangan yang betul dengan fungsi templat variadic menggunakan jenis pengembalian trailing dan `decltype`?

Susan Sarandon
Lepaskan: 2024-11-13 06:09:02
asal
317 orang telah melayarinya

How can I ensure correct return type deduction with a variadic template function using trailing return type and `decltype`?

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&amp; t, const P&amp;... p) -> decltype(t + sum(p...))
{
   return t + sum(p...);
}
Salin selepas log masuk

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&amp; t, const P&amp;... p);
Salin selepas log masuk

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

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

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!

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