スタックとキューの両方を出力できる汎用関数を作成しようとしました。開発者がコンパイルエラーに遭遇した場合。コンテナの型を識別するために std::is_same を利用しているにもかかわらず、関数は機能しないままです。
エラーは、if-else ステートメントの両方の分岐が正常にコンパイルされる必要があるという事実から発生しますが、この例では違反しています。 。この問題に対処するために、部分特殊化と element_accessor テンプレート struct を使用して変更が実装されています:
<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(); } }
あるいは、C 17 以降では、部分特殊化ではなく if constexpr を使用してエラーを回避できます:
<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>
以上が関数内で異なるコンテナー タイプを処理しようとすると std::is_same が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。