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 allowed
がunresolved 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;
};