関数内で異なるコンテナー タイプを処理しようとすると std::is_same が失敗するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-01 14:09:02
オリジナル
170 人が閲覧しました

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

std::is_same の使用: 関数がさまざまなコンテナ タイプの処理に失敗する理由

スタックとキューの両方を出力できる汎用関数を作成しようとしました。開発者がコンパイルエラーに遭遇した場合。コンテナの型を識別するために 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&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();
   }
}
ログイン後にコピー

あるいは、C 17 以降では、部分特殊化ではなく if constexpr を使用してエラーを回避できます:

<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>
ログイン後にコピー

以上が関数内で異なるコンテナー タイプを処理しようとすると std::is_same が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!