boostorg / boostorg/python

std::vector<std::tuple<>> working only with NoProxy set with vector_indexing_suite

未關閉
#112 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
主要語言
C++
星號
537
分支
223
平均合併
11 小時 22 分鐘
30 天內合併 PR
2

描述

Hi, I'm trying to export from C++ an std::vector of a tuple. Unfortunately, while both the vector (exported via `vector_indexing_suite`) and the tuple (exported via `to_python_converter`) themselves are exported correctly and can be accessed, accessing a tuple element *from* the vector results in an `No Python class registered for C++ class` error. This does not happen when the `vector_indexing_suite` has the `NoProxy` template parameter set to `true`, which for me is undesirable.

Am I doing something wrong, or is there a way to bypass this limitation?

Here is a MVE:

```
#include
#include

#include
#include

template
struct TupleToPython {
TupleToPython() {
boost::python::to_python_converter>();
}

template
struct sequence {};

template
struct generator : generator { };

template
struct generator<0, S...> {
using type = sequence;
};

template
static boost::python::tuple boostConvertImpl(const T& t, sequence) {
return boost::python::make_tuple(std::get(t)...);
}

template
static boost::python::tuple boostConvert(const std::tuple & t) {
return boostConvertImpl(t, typename generator::type());
}

static PyObject* convert(const T& t) {
return boost::python::incref(boostConvert(t).ptr());
}
};

using MyTuple = std::tuple;
using Tuples = std::vector;

MyTuple makeMyTuple() {
return MyTuple();
}

Tuples makeTuples() {
return Tuples{MyTuple()};
}

BOOST_PYTHON_MODULE(h)
{
using namespace boost::python;

TupleToPython();
def("makeMyTuple", makeMyTuple);

class_>{"Tuples"}
.def(vector_indexing_suite>());
def("makeTuples", makeTuples);
}
```

Then from Python:

```
>>> print makeMyTuple()
(0,)
>>> print makeTuples()

>>> print makeTuples()[0]
Traceback (most recent call last):
File "", line 1, in
TypeError: No Python class registered for C++ class std::tuple
>>>
```

貢獻指南

這個儲存庫沒有索引到貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。