为什么我需要boost python矢量索引套件中的比较运算符?

Han*_*ans 6 c++ boost boost-python comparison-operators

我想公开C++代码

std::vector<A>
Run Code Online (Sandbox Code Playgroud)

到python.我的

class A{};
Run Code Online (Sandbox Code Playgroud)

没有实现比较运算符.当我尝试

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> >());
}
Run Code Online (Sandbox Code Playgroud)

我收到有关比较运算符的错误.如果我将A的定义更改为

class A {
public:
  bool operator==(const A& other) {return false;}
  bool operator!=(const A& other) {return true;}
};
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力.

为什么我需要实现这些比较运算符?vector_indexing_suite没有它们有没有办法使用它们?

Luc*_*lle 5

vector_indexing_suite实现一个__contains__成员函数,它需要存在一个相等运算符.因此,您的类型必须提供此类操作员.

Sandbox版本的Boost.Python通过使用特征来确定容器上可用的操作类型来解决此问题.例如,find只有在值相等的情况下才会提供.

默认情况下,Boost.Python认为所有值都是可比较的,而不是可比较的.由于您的类型不符合这些要求,因此您需要专门化特征以指定它支持的操作:

namespace indexing {
  template<>
  struct value_traits<A> : public value_traits<int>
  {
    static bool const equality_comparable = false;
    static bool const lessthan_comparable = false;
  };
}
Run Code Online (Sandbox Code Playgroud)

在此处记录.