ホームページ > バックエンド開発 > C++ > 私の関数が `std::is_same` を使用して複数のコンテナ タイプを処理できないのはなぜですか?

私の関数が `std::is_same` を使用して複数のコンテナ タイプを処理できないのはなぜですか?

Linda Hamilton
リリース: 2024-11-01 07:23:30
オリジナル
414 人が閲覧しました

Why Can't My Function Handle Multiple Container Types Using `std::is_same`?

関数が std::is_same を使用して複数のコンテナー タイプを処理できない理由

あなたの目的は、次の要素を出力できる汎用関数 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&lt ;クラス> 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 サイトの他の関連記事を参照してください。

ソース:php.cn
前の記事:Visual Studio 2019 C プロジェクトでバルト文字を処理し、それを使用して CMD コマンドを実行するにはどうすればよいですか? 次の記事:プログラムが終了すると、リークしたメモリは解放されますか?
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
関連トピック
詳細>
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート