2012-09-10 59 views
1


我已經開始使用boost:icl庫,它非常全面和方便。我主要使用boost,icl :: interval_set和boost :: icl :: interval_map兩種類型的時間間隔。有時候我必須使用兩種類型的間隔部分來操作,而我在做複製函數時並不感興趣。
boost icl interval_map interval_set模板

因此,這裏是我的例子:

template<typename T> 
void UniqSegmentsInA(T &a,T &b,T &c,int max_gap=200) 
{ 
typename T::iterator __it1 = a.begin(); 
typename T::iterator __it2 = b.begin(); 
bool _checking_=true; 

while(__it1 != a.end() && __it2 != b.end()) 
{ 
    typename T::interval_type __itv1 = getFirst(*__it1); 
    typename T::interval_type __itv2 = getFirst(*__it2); 

    if(__itv1.upper()>__itv2.upper()) 
    { 
     /*if segments intersect and we should move second segment then segment A should not be included in output*/ 
     if(intersects(T::interval_type::closed(__itv1.lower()-max_gap,__itv1.upper()+max_gap),__itv2)) _checking_=false; 
     __it2++; 
    } 
    else 
    { 
     if(!intersects(T::interval_type::closed(__itv1.lower()-max_gap,__itv1.upper()+max_gap),__itv2) && _checking_) 
     { 
      c.add((*__it1)); 
     } 
     _checking_=true; 
     __it1++; 
    } 
} 
if(__it1 != a.end() && !_checking_) __it1++; 
while(__it1 != a.end()) 
{ 
    c.add(*__it1); 
    __it1++; 
} 
} 

getFirst()是當它是一個映射,然後返回。首先,當它是一組則只是一個迭代器的輔助功能。

bicl::interval_map<int,int>::interval_type inline getFirst(bicl::interval_map<int,int>::segment_type a) 
{ 
return a.first; 
} 

bicl::interval_set<int>::interval_type inline getFirst(bicl::interval_set<int>::segment_type a) 
{ 
return a; 
} 

所以這個例子像預期的那樣工作。我想要改進的是getFirst()函數,我不想在interval_map/set中設置硬編碼類型的域和codomain。我已經試過這樣的事情:

template<typename T> 
typename bicl::interval_map<T,T>::interval_type inline getFirst(typename bicl::interval_map<T,T>::segment_type a) 
{ 
return a.first; 
} 

然後,我改變:

typename T::interval_type __itv1 = getFirst<typename T::domain_type>(*__it1); 
    typename T::interval_type __itv2 = getFirst<typename T::domain_type>(*__it2); 

,但它不工作和編譯器提供了一個錯誤:

src/Intersections.cpp:324:35: error: no matching function for call to ‘getFirst(const std::pair<const boost::icl::discrete_interval<int, std::less>, int>&)’ 
src/Intersections.cpp:324:35: note: candidates are: 
src/Intersections.cpp:52:56: note: template<class T> typename boost::icl::interval_map<T, T>::interval_type getFirst(typename boost::icl::interval_map<T, T>::segment_type) 
src/Intersections.cpp:57:56: note: boost::icl::interval_set<int>::interval_type getFirst(boost::icl::interval_set<int>::segment_type) 
src/Intersections.cpp:57:56: note: no known conversion for argument 1 from ‘const std::pair<const boost::icl::discrete_interval<int, std::less>, int>’ to ‘boost::icl::interval_set<int>::segment_type {aka boost::icl::discrete_interval<int, std::less>}’ 

所以問題是,它是在這個例子中可能不在getFirst()函數中硬編碼域和共域類型?

感謝, 安德烈

回答

3

您可以使用函數模板

key_value 

用於這一目的。它在

boost\icl\concept\set_value.hpp 
and 
boost\icl\concept\map_value.hpp 

像這樣定義

template<class Type, class Iterator> 
inline typename enable_if<is_set<Type>, const typename Type::key_type>::type& 
key_value(Iterator it_) 
{ 
    return *it_; 
} 

template<class Type, class Iterator> 
inline typename enable_if<is_map<Type>, const typename Type::key_type>::type& 
key_value(Iterator it_) 
{ 
    return (*it_).first; 
} 
+0

我不知道爲什麼,當我只是在我的頭文件複製這兩個函數,他們不工作,但是當我包括原標題一切很好。 –