Я ломал голову, пытаясь передать векторы посредством ссылки на метод шаблона C ++, но все, что я получаю, — это пустой список, по-видимому, параметр передается по значению.
Я использую Cython 0.18 & Python 2.7
Есть идеи?
Сторона C ++
class VectByRef
{
public:
VectByRef::VectByRef();
template<typename T>
void GetVector(T& var);
}
template<typename T>
void VectByRef::GetVector(T& var)
{
var.push_back(1);
var.push_back(2);
var.push_back(3);
}
Сторона Cython
cdef extern from "VectByRef.h":
cdef cppclass VectByRef:
VectByRef() except
vector[cython.int] GetVector(vector[cython.int])
def getVector(self):
cdef vector[cython.int] resultVectInt
self._vectByRef.GetVector(<vector[cython.int]> resultVectInt)
print(resultVectInt) # The result is an empty list []
Я не уверен, что это действительно отвечает на вопрос, но я пока не могу комментировать, чтобы получить разъяснения.
Когда я попытался скомпилировать это, я получил ошибку:
error: no matching function for call to ‘VectByRef::GetVector(std::vector<int>)’
Ошибка была устранена путем изменения вызова на стороне Cython на
.GetVector(<vector[cython.int]&> resultVectInt)
Снятие квалификации типа вообще также сработало:
.GetVector(resultVectInt)
Оба из них дали желаемый результат, а также: [1, 2, 3]
Это также использовало Python 2.7 с Cython 0.17 & 0,19. Так что я предполагаю, что или что-то еще происходит, или есть конкретная ошибка с 0,18.
Других решений пока нет …