使用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

回到顶部