Mengapa std::is_same gagal apabila cuba memproses jenis bekas yang berbeza dalam fungsi?

Mary-Kate Olsen
Lepaskan: 2024-11-01 14:09:02
asal
170 orang telah melayarinya

Why does std::is_same fail when trying to process different container types in a function?

Menggunakan std::is_same: Mengapa Fungsi Gagal Memproses Jenis Bekas Berbeza

Dalam percubaan untuk mencipta fungsi serba boleh yang mampu mencetak kedua-dua susunan dan baris gilir, a pembangun menghadapi ralat penyusunan. Walaupun menggunakan std::is_same untuk membezakan jenis bekas, fungsi itu tetap tidak berfungsi.

Ralat berpunca daripada fakta bahawa kedua-dua cabang pernyataan if-else mesti berjaya disusun, yang dilanggar dalam kejadian ini . Untuk menangani isu ini, pengubahsuaian dilaksanakan menggunakan pengkhususan separa dan struct templat element_accessor:

<code class="cpp">template <typename Cont>
struct element_accessor;

template <typename T>
struct element_accessor<std::stack<T>> {
   const T&amp; operator()(const std::stack<T>&amp; s) const { return s.top(); }
};

template <typename T>
struct element_accessor<std::queue<T>> {
   const T&amp; operator()(const std::queue<T>&amp; q) const { return q.front(); }
};

template<typename Cont>
void print_container(Cont&amp; cont){
   while(!cont.empty()){
      auto elem = element_accessor<Cont>{}(cont);
      std::cout << elem << '\n';
      cont.pop();
   }
}
Salin selepas log masuk

Sebagai alternatif, untuk C 17 dan lebih tinggi, ralat boleh dielakkan menggunakan if constexpr dan bukannya pengkhususan separa:

<code class="cpp">template<template<class> typename Cont, typename T>
void print_container(Cont<T>&amp; cont){
   while(!cont.empty()){
      if constexpr (std::is_same_v<Cont<T>, std::stack<T>>) 
         std::cout << cont.top() << '\n';
      else if constexpr (std::is_same_v<Cont<T>, std::queue<T>>) 
         std::cout << cont.front() << '\n';
      cont.pop();
   }
}</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa std::is_same gagal apabila cuba memproses jenis bekas yang berbeza dalam fungsi?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!