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& operator()(const std::stack<T>& s) const { return s.top(); } }; template <typename T> struct element_accessor<std::queue<T>> { const T& operator()(const std::queue<T>& q) const { return q.front(); } }; template<typename Cont> void print_container(Cont& cont){ while(!cont.empty()){ auto elem = element_accessor<Cont>{}(cont); std::cout << elem << '\n'; cont.pop(); } }
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>& 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>
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!