ホームページ  >  記事  >  バックエンド開発  >  関数内で異なるコンテナー タイプを処理しようとすると std::is_same が失敗するのはなぜですか?

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 14:09:02171ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。