如何从cython公开静态constexpr

2024-07-18 13:36:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将下面的示例从cpp包装到cython,以便在Python中使用

class Foo1 : public MFoo<unsigned int> { 
public:
    constexpr Foo1(unsigned int val) : MFoo{val} {}
    }
};

class Foo{
public:
    static constexpr Foo1 any {0};
    static constexpr Foo1 one {1<<1};
    static constexpr Foo1 two {1<<2};
};

这就是我目前所拥有的 文件.pxd在

^{pr2}$

我的文件.pyx在

def Bar(self,PyFoo1 abc)
    return file.Bar(######) # how would I call something like Foo::one       

我要知道怎么用cython包装这个。我正在使用How to expose a constexpr to Cython? 这是相似的,但仍然不是很有用


Tags: 文件tofoobarstaticvalpublicone
1条回答
网友
1楼 · 发布于 2024-07-18 13:36:12
<> P>你的主要问题是Cython没有提供一种表达C++静态成员变量的方法。为了解决这个问题,可以将它们放在全局范围内,并使用字符串来确保生成正确的C++代码。constexpr是不相关的-Cython不需要知道它。在

我创建了一个最小的示例,它稍微简化了您的示例(例如,它省略了您没有为其提供定义的无关模板类):

class C {
public:
    constexpr C(unsigned int) {}
};

class D {
public:
    static constexpr C any {0};
    static constexpr C one {1<<1};
    static constexpr C two {1<<2};
};

inline void bar(const C&) {}

在赛顿:

^{pr2}$ <>注意,在^ {< CD5>}内,我不将^ ^ }、^ {CD3>}和^ {CD4>}放进去,但确保字符串创建C++代码^ {< CD6>}等


我想还有第二个问题是如何从Python调用bar。显然有许多选项,但是一个简单的方法是传递一个字符串,并有一个Cython函数,它将字符串与C++值匹配:

# except NULL allows Cython to signal an error to the calling function
cdef const C* get_C_instance(s) except NULL:
    if s=="any":
        return &any
    elif s=="one":
        return &one
    elif s=="two":
        return &two
    raise ValueError("Unrecognised string {0}".format(s))

def py_bar(s):
    return bar(get_C_instance(s)[0])

这不是创建Python接口的唯一解决方案—例如,您可以创建一个包含C的包装器类,并将其实例称为anyonetwo。在

相关问题 更多 >