あなたの目的は、次の要素を出力できる汎用関数 print_container を作成することです。スタックコンテナとキューコンテナの両方。ただし、コンテナーの種類を確認するために std::is_same を使用しているにもかかわらず、関数でエラーが発生します。
エラーの原因:
エラーが発生するのは、if の両方の分岐が原因です。 -else ステートメントはコンパイル可能である必要があります。あなたの場合、Cont が std::stack の場合、std::stack に存在しないフロントメンバー関数がアクセスされます。同様に、Cont が std::queue の場合、std::queue に存在しない最上位のメンバー関数がアクセスされます。
部分特殊化ソリューション:
考えられる解決策の 1 つは、部分特殊化を使用して各コンテナ タイプを個別に処理することです。
<br>template <typename Cont><br>struct element_accessor;</p> <p>template <typename T><br>struct element_accessor<std::stack<T>> {<br> const T& 演算子()(const std::stack<T>& s) const { return s.top(); }<br>};</p> <p>テンプレート <typename T><br>struct element_accessor<std::queue<T>> {<br> const T&operator()(const std::queue<T>& q) const { return q.front(); }<br>};</p> <p>テンプレート<typename Cont><br>void print_container(Cont& cont){<br> while(!cont.empty()){</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> auto elem = element_accessor<Cont>{}(cont); std::cout << elem << '\n'; cont.pop();
}
}
このアプローチでは、要素の取得を特殊な element_accessor 関数に委任し、コンテナー タイプごとに適切なアクセサーを提供します。
C 17 if constexpr による解決策:
C 17 以降を使用している場合は、if constexpr 構造を利用することもできます:
<br>template<template< ;クラス> typename Cont, typename T><br>void print_container(Cont<T>& cont){<br> while(!cont.empty()){</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 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();
}
}
このソリューションは if constexpr を使用して、コンテナーの種類に基づいて適切なコードを条件付きで実行し、部分的な特殊化の必要性を回避します。
以上が私の関数が `std::is_same` を使用して複数のコンテナ タイプを処理できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。