boostorg / boostorg/python

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

Ouverte
#112 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
C++
Étoiles
537
Forks
223
Merge moyen
11 h 22 min
PR mergées (30 j)
2

Description

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
>>>
```

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.