2012-05-21 3 views
6

나는 파이썬에부스트 파이썬 벡터 인덱싱 슈트에서 비교 연산자가 필요한 이유는 무엇입니까?

std::vector<A> 

와 C++ 코드를 노출하고 싶습니다. 내

class A{}; 

에는 비교 연산자가 구현되어 있지 않습니다. 시도 할 때

BOOST_PYTHON_MODULE(libmyvec) 
{ 
    using namespace boost::python; 
    class_<A>("A"); 
    class_<std::vector<A> >("Avec") 
    .def(boost::python::vector_indexing_suite<std::vector<A> >()); 
} 

나는 비교 연산자에 대해 오류가 발생합니다. A의 정의를

으로 변경하면
class A { 
public: 
    bool operator==(const A& other) {return false;} 
    bool operator!=(const A& other) {return true;} 
}; 

매력처럼 작동합니다.

왜 이러한 비교 연산자를 구현해야합니까? 그들없이 vector_indexing_suite을 사용할 방법이 있습니까?

답변

5

vector_indexing_suite은 동등 연산자가 있어야하는 멤버 함수 __contains__을 구현합니다. 결과적으로, 귀하의 유형은 그러한 운영자를 제공해야합니다.

Boost.Python의 샌드 박스 버전은 특성을 사용하여 컨테이너에서 사용할 수있는 작업을 결정함으로써이 문제를 해결합니다. 예를 들어, 값이 동등한 경우에만 find이 제공됩니다.

기본적으로 Boost.Python은 모든 값을 동등 비교 가능하고 비교할 수없는 값으로 간주합니다. 당신의 유형은 이러한 요구 사항을 충족하지 않기 때문에, 당신은 지원하는 작업을 지정하는 특성을 전문화 할 필요가 :이 here을 문서화

namespace indexing { 
    template<> 
    struct value_traits<A> : public value_traits<int> 
    { 
    static bool const equality_comparable = false; 
    static bool const lessthan_comparable = false; 
    }; 
} 

.

+0

답변 해 주셔서 감사합니다. 이 코드는 부스트 샌드 박스에서만 사용할 수 있습니까? 가장 쉬운 방법은 무엇입니까? [샌드 박스] (https://svn.boost.org/svn/boost/sandbox/python_indexing_v2/)에서 파일을 교환 한 후 수동으로 부스트를 다운로드하고 컴파일해야합니까? – Hans

+0

이 기능은 아직 Boost.Python의 출시 버전에 포함되어 있지 않으므로 사용하려면 샌드 박스에서 최신 버전을 다운로드하고 다시 빌드해야합니다. 그러나, 나는이 버전의 상태가 무엇인지 (아직 리뷰되지 않음) 모르므로 비교 연산자의 더미 구현을 고수하는 것이 가장 좋습니다. –

관련 문제