0

std::includeアルゴリズムを使用して、異種の STL コレクションを操作したいと考えています。私の例ではstd::vector、整数の が に含まれているかどうかを確認したいと思いstd::mapます。

シンプルなテンプレート関数を使用してこの問題を解決したいと思います。この理由は、C++ テンプレート引数推定を使用して、比較関数の最初の引数が std::pair 対 int であり、その逆である場合に推定できるようにしたいためです (std::include舞台裏で Comp(a,b を呼び出します) ) および Comp(b,a) )。

私のコードの下で実行したい

    typedef std::map<int,std::string> dict;
    typedef std::vector<int> vect;

    int data[]={1,2,3,4};
    vect l(data,data+4);
    dict h;
    h.insert(dict::value_type(0,"ciccio"));
    h.insert(dict::value_type(1,"ciccio"));                  
    std::includes( h.begin(),h.end()
        , l.begin(), l.end(), is_my_less );

以下を試してみましたが、コンパイルして言うことはできませんpartial specialization is not allowedunresolved overloaded function type、関数に何か問題があると思います。テンプレート化された関数を厳密に使用することでそれが可能であることを知っていますか?

    template<class T1,class T2,class T3>
    bool is_less_than_pair( const T1&a ,const T2& b ){
        return false;
    };

    template<class T1,class T>
    bool is_less_than_pair<
        T1
        , std::pair<T1,T>
        , T >( const T1&a, const std::pair<T1,T>& b ){
        return a<b.first;
    }

    template<class T1, class T>
    bool is_less_than_pair< 
        std::pair<T1,T>
        ,T1
        , T >( const std::pair<T1,T>& a, const T1& b ){
        return a.first<b;
    }

関数テンプレートを部分的に特化することはできないという事実に基づいて、以下のように関数のオーバーロードを試みましたが、うまくいかず、gcc がunresolved overloaded function type再度教えてくれました。私にできる最善のことは何ですか?

      template<class T1,class T2>
      bool is_less_than_pair( const std::pair<T1,T2>& a ,const T1& b ){
        return a.first<b;
      };
      template<class T1,class T2>
      bool is_less_than_pair( const T1& a ,const std::pair<T1,T2>& b ){
        return b.first<a;
      };
4

1 に答える 1

4

関数に制限されている場合は、いいえ。STL アルゴリズムに渡すときに適切なオーバーロードを選択できないため、オーバーロードされた関数は使用できません。また、関数テンプレートを部分的に特殊化することはできません。

すべてのオーバーロードを提供することにより、関数オブジェクトで実行できます。実際には、すべてのオーバーロードを STL アルゴリズムに渡すと、呼び出されたときに適切なオーバーロードが選択されます。マップの値がstd::pair<const int, string>&であるという事実により、混合モード演算子の両側で同じ T1 を使用しても機能しないことに注意してください。これは、ベクトルのイテレータが int& になり、マップが定数を使用しているためです。

struct my_less_than
{
   template <typename T1>
   bool operator()(const T1& lhs, const T1& rhs) const
   {
      return lhs < rhs;
   }

   template <typename T1, typename T2, typename T3>
   bool operator()(const T1& lhs, const std::pair<T2, T3>& rhs) const
   {
      return lhs < rhs.first;
   }

   template <typename T1, typename T2, typename T3 >
   bool operator()(const std::pair<T1, T2>& lhs, const T3& rhs) const
   {
      return lhs.first < rhs;
   }

   template <typename T1, typename T2, typename T3>
   bool operator()(const std::pair<T1, T2>& lhs, const std::pair<T1, T3>& rhs) const
   {
      return lhs.first < rhs.first;
   }
};

使用法:

   std::includes( h.begin(),h.end()
        , l.begin(), l.end(), my_less_than() );

編集:例http://ideone.com/JFIoy

于 2012-05-14T20:23:46.117 に答える