2009-05-05 2 views

답변

5

나는이 문제가 Boost::Any이 아니라 사용자 정의 비교기를 지정하지 않는다고 생각합니다. map은 정렬 된 연관 컨테이너이기 때문에 비교자를 가져야합니다. 나를 위해

다음 작품 : 그것에 맞게 당신의 목적에 따라이 :

#include <iostream> 
#include <map> 
#include <boost/any.hpp> 

using namespace std;  
struct cmp { 
    bool operator()(const boost::any& l, const boost::any& r) { 
     try 
     { 
      int left = boost::any_cast<int>(l); 
      int right = boost::any_cast<int>(r); 
      return left < right; 
     } 
     catch(const boost::bad_any_cast &) 
     { 
      return false; 
     } 

     return false; 
    } 
}; 
int main() { 
    map<boost::any, string, cmp> ma; 
    boost::any to_append = 42; 
    ma.insert(std::make_pair(to_append, "int")); 
    if (ma.find(42) != ma.end()) { 
     cout << "hurray!\n"; 
    } 
    return 0; 
} 
+2

비교 펑터는 맵에서 사용하기에 유효하지 않습니다. 일부 (a, b) 쌍에 대해

+0

좋은 예가 될 것입니다. 어쨌든 비교기가 실패 할 경우 더 많은 경우를 구성 할 수 있다고 생각합니다. 여러 유형에 걸쳐 주문하는 것에 대한 아이디어는 나에게 좋지 않습니다. – dirkgently

+0

예제는 하나의 (a)가 포함되고 int이고 다른 하나의 (b)가 문자열을 포함하는 모든 쌍입니다. 비교기는

1

당신은 당신이 사용하는 모든 종류의 필적 확신 할 수 있도록, boost::variant보다는 boost::any보고 할 수 있습니다.

방문객을 사용하면 variant 초에 비교 연산자를 제공하는 것이 가장 좋습니다.

관련 문제