Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah jenis pulangan mengekor boleh digunakan dengan fungsi templat variadic untuk menyimpulkan jenis pulangan yang betul untuk fungsi yang menjumlahkan hujah pelbagai jenis?

Bagaimanakah jenis pulangan mengekor boleh digunakan dengan fungsi templat variadic untuk menyimpulkan jenis pulangan yang betul untuk fungsi yang menjumlahkan hujah pelbagai jenis?

DDD
DDDasal
2024-11-15 02:26:02415semak imbas

How can trailing return types be used with variadic template functions to deduce the correct return type for a function that sums arguments of varying types?

Jenis Pulangan Mengekor Menggunakan Dectype dengan Fungsi Templat Variadik

Apabila cuba mencipta fungsi templat variasi yang menjumlahkan hujah pelbagai jenis dan pulangan jumlah yang ditaip dengan betul, isu biasa timbul.

Perumusan Masalah

Pelaksanaan asas menggunakan decltype sebagai jenis pengembalian mengekor mengakibatkan tingkah laku yang tidak ditentukan untuk argumen yang melebihi dua. Untuk mengelakkan ini, fungsi boleh diisytiharkan secara eksplisit, tetapi ini membawa kepada potongan jenis yang salah untuk berbilang argumen.

Penyelesaian Menggunakan Kelas Ciri Tersuai

Untuk mengatasi isu ini, kelas ciri tersuai yang dipanggil sum_type digunakan. Ia secara rekursif mengira jenis pulangan menggunakan std::add_rvalue_reference dan std::val.

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

Pelaksanaan Diubahsuai

Dengan menggantikan decltype dengan typename sum_type::taip jenis pengembalian mengekori, fungsi menyimpulkan jenis hasil dengan betul untuk sebarang bilangan argumen:

template <class T, class... P>
auto sum(const T& t, const P&amp;... p) -> typename sum_type<T,P...>::type
{
   return t + sum(p...);
}

Potongan Jenis Yang Diperbaiki

Selain itu, pengubahsuaian kepada pengkhususan terakhir sum_type menyediakan potongan jenis yang dipertingkatkan:

template<class T, class U, class... P> struct sum_type<T,U,P...>
: id<decltype(
      val<T>()
    + val<typename sum_type<U,P...>::type>()
)>{};

Ini memastikan bahawa jenis pemulangan sepadan dengan decltype(a (b c)), sejajar dengan susunan tambahan yang dijangkakan.

Atas ialah kandungan terperinci Bagaimanakah jenis pulangan mengekor boleh digunakan dengan fungsi templat variadic untuk menyimpulkan jenis pulangan yang betul untuk fungsi yang menjumlahkan hujah pelbagai jenis?. 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