2012-05-14 33 views
0

我想使用算法std::include来处理异构STL集合。在我的示例中,我想检查std::map中是否包含整数的std::vector通过使用专用函数异构集合的STL算法

我想通过使用简单的模板函数来解决这个问题;原因是我想使用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; 
     }; 
+0

不能partialy专门的函数模板。 – jrok

+0

@jrok。非常感谢我添加了另一个潜在的解决方案,因为这个事实,但它不工作......你能帮忙吗? –

回答

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

+0

谢谢了!它工作的很好!:D –

+0

我认为第四个重载应该是const const std :: pair &lhs,const std :: pair &rhs' - 第二个类型没有使用,所以谁在乎它是否不同? – ildjarn

+0

@ildjarn:你说的对,我刚刚剪切粘贴。我已更新以符合您的建议 –