Проблема с методом переноса шаблона с помощью CythonC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Проблема с методом переноса шаблона с помощью Cython

Сообщение Anonymous »

Я хотел реализовать построитель, который мог бы принимать различные типы входных данных, поэтому я написал следующий код C++:

Код: Выделить всё

//ElementBuilder.h
namespace DataStructure{

class ElementBuilder: public std::enable_shared_from_this{
private:
std::shared_ptr element;
public:
ElementBuilder();

template 
std::shared_ptr add(const T& value);

std::shared_ptr build();

};
template std::shared_ptr ElementBuilder::add(const int& value);
template std::shared_ptr ElementBuilder::add(const std::string& value);
template std::shared_ptr ElementBuilder::add(const double& value);
template std::shared_ptr ElementBuilder::add(const std::shared_ptr& value);

}

Я протестировал приведенный выше код на C++, и он работает нормально. Однако когда я попытался обернуть код C++ с помощью Cython для использования функции add в Python, я столкнулся с проблемами с оберткой add[shared_ptr] в Cython.
Вот Код Cython.

Код: Выделить всё

cdef extern from "utils/element_builder.h" namespace "DataStructure":
cdef cppclass _ElementBuilder "DataStructure::ElementBuilder":
_ElementBuilder()

# These work well if I compile without add[shared_ptr[_Element]]
shared_ptr[_ElementBuilder] add[int](int value)
shared_ptr[_ElementBuilder] add[string](string value)

# It fails if I try to compile with add[shared_ptr[_Element]]
shared_ptr[_ElementBuilder] add[shared_ptr[_Element]](shared_ptr[_Element] value)

Код: Выделить всё

_Element
— это обернутый класс Element.
Возможно, я смогу решить эту проблему, переобернув только ElementBuilder::add в новую функцию, а затем обернуть новую функцию Cython. При использовании этого подхода основная причина использования шаблонов, а именно обработка нескольких типов с помощью одной функции, становится ненужной. Есть ли хорошие решения для более эффективного устранения вышеуказанной ошибки?

Подробнее здесь: https://stackoverflow.com/questions/785 ... ith-cython
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»