6

我想公开 C++ 代码

std::vector<A>

到蟒蛇。我的

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没有它们有什么方法可以使用吗?

4

1 回答 1

5

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

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;
  };
}

在此处记录。

于 2012-05-21T09:09:43.097 回答