使用cython包装一个C++单例程
使用Cython将一些C++ API的部分包装到python中,我误解了我无法通过搜索类似的问题来修复。我喜欢访问具有私有构造函数和公共方法GetInstance的Factory类。使用cython包装一个C++单例程
namespace cpplibrary {
class CppFactory
{
public:
static CppFactory& GetInstance();
private:
CppFactory(void);
CppFactory(const CppFactory&);
};
}
我尝试了用Cython代码,如:
cdef extern from "cppFactory.h" namespace "cpplibrary": cdef cppclass CppFactory:
CppFactory() except +
CppFactory& GetInstance()
cdef class PyFactory:
cdef CppFactory* _thisptr
def __cinit__(self):
self._thisptr = GetInstance()
我检查与尽可能多的变种,因为我以为。有和没有extern中构造函数的声明。用不同的方法来定义来自不同发布示例的_thisptr。等等。但我找不到像这样的单例。
我看不见的错误在哪里?
回答:
我认为你有两个问题:
1)如何来包装静态方法:the recommended way是声明类的外部功能,并使用一个字符串来告诉用Cython它应该使用什么名称C++
2)分配到thisptr
,你只需要使用&
从引用中获取指针。
代码:
cdef extern from "cppFactory.h" namespace "cpplibrary": cdef cppclass CppFactory:
CppFactory() except +
# declare outside the class and use a string to specify name
# unfortunately this doesn't seem to play well with namespace
# so we need to specify it again
cdef CppFactory& CppFactory_GetInstance "cpplibrary::CppFactory::GetInstance"()
cdef class PyFactory:
cdef CppFactory* _thisptr
def __cinit__(self):
self._thisptr = &CppFactory_GetInstance()
回答:
一个问题确实是(这里Getinstance()
)包装的静态方法。
你可以做到这一点通过用Cython @staticmethod
装饰(见用Cython的doc here):
cdef extern from "cppFactory.h" namespace "cpplibrary": cdef cppclass CppFactory:
@staticmember
CppFactory& GetInstance()
然后,.pyx可以是:
cdef class PyFactory: cdef CppFactory* _thisptr
def __cinit__(self):
self._thisptr = new CppFactory()
以上是 使用cython包装一个C++单例程 的全部内容, 来源链接: utcz.com/qa/265671.html