2010-06-02 5 views

답변

3

다음 중 어떨까요? boost :: function을 사용하여 비교기의 실제 유형을 지 웁니다. 비교기는 boost : bind 자체를 사용하여 생성됩니다.

typedef std::pair<int, int> IntPair; 
    typedef boost::function<bool (const IntPair &, const IntPair &)> Comparator; 
    Comparator c = boost::bind(&IntPair::second, _1) < boost::bind(&IntPair::second, _2); 
    std::set<IntPair, Comparator> s(c); 

    s.insert(IntPair(5,6)); 
    s.insert(IntPair(3,4)); 
    s.insert(IntPair(1,2)); 
    BOOST_FOREACH(IntPair const & p, s) 
    { 
    std::cout << p.second; 
    } 
0

문제는 - 코드를 템플릿으로 작성하거나 C++ 0x 기능을 사용하지 않는 한 boost :: bind 표현식의 이름을 지정해야한다는 것입니다. 그러나 이러한 유형의 이름은 대개 매우 복잡합니다. C++ 98

템플릿 인수 공제 : C에서 자동차와 decltype으로

template<class Fun> 
void main_main(Fun fun) { 
    set<pair<int,long>,Fun> s (fun); 
    … 
} 

int main() { 
    main_main(…boost::bind(…)…); 
} 

+ +0 :

실제 바인드 표현으로
int main() { 
    auto fun = …boost::bind(…)…; 
    set<pair<int,long>,decltype(fun)> s (fun); 
    main_main(boost::bind(…)); 
} 

, 나는 이런 식으로 뭔가 생각 :

typedef std::pair<int,long> pil; 
boost::bind(&pil::second,_1) < boost::bind(&pil::second,_2) 

(안된)