使用Cython将一些部分从C ++ API包装到python中,我有一些误解,我无法通过搜索类似的问题来解决这个问题。我喜欢访问具有私有构造函数和公共方法GetInstance。
的Factory类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 。等等。但我无法找到像这样的单身例子。
我无法看到的错误在哪里?
答案 0 :(得分:1)
我认为你有两个问题:
1)如何包装静态方法:the recommended way是在类外声明函数,并使用字符串告诉Cython它应该在C ++中使用什么名称
2)分配到 int j=0,len;
for(int k=0;a[k]!='\0';k++) // loop until a[k] is not '\0'
{
j++; // increment j (at last gives length of string )
}
len=j; // initialize len with value of j
for(i=0;i<len;i++){ // loop from i to len
if(s[i]==s[j]){ // compare value at index i and len
// do something
}
j--; // decrement j
}
,您只需要使用thisptr
从引用中获取指针。
代码:
&
答案 1 :(得分:1)
其中一个问题确实是包装一个静态方法(这里是@staticmethod
)。
你可以使用cython cdef extern from "cppFactory.h" namespace "cpplibrary":
cdef cppclass CppFactory:
@staticmember
CppFactory& GetInstance()
装饰器来做到这一点(参见Cython&#39; doc update):
cdef class PyFactory:
cdef CppFactory* _thisptr
def __cinit__(self):
self._thisptr = new CppFactory()
然后,.pyx可以是:
var m = item["str"].replace(/[^a-zA-Z0-9 ]/g," ").trim().split(" ");
console.log("count: " + m.length + " words: " + m);