SWIG 董事未按预期工作的问题

问题描述 投票:0回答:1

我正在使用 SWIG 链接我的 CPP API 和 Python API

我在我的 .i 文件中创建了一个简单的回调类,我在我的 .py 文件中继承了它, 但是当我将 python 创建的类作为指针传递时,不会调用重写的函数, 这是代码:

//example.i


%module(directors="1") example

%inline %{
class CBack {
    public:
        virtual int operator()(int x, int y) const {
            return x+y;
        }
        virtual int handle(int x, int y)
        {
            return -1;
        }
        virtual ~CBack() {}
    };

    int callF(CBack* f, int xv, int yv)
    {
        return f->handle(xv, yv);
    }
%}

%feature("director") CBack;
//example.py


class Mul(example.CBack):

    @override
    def handle(self, x: int, y: int) -> int:
        return x * y

print(example.callF(Mul(), 3, 7)) //print -1 but should print 21

print(str(Mul().handle(3,7))) // print 21

我附上了显示我尝试过的代码, 我希望调用已调度的调用

python inheritance swig
1个回答
0
投票

%feature("director") CBack;
必须在处理代码之前声明。将它移到代码的前面:

// example.i
%module(directors="1") example
%feature("director") CBack;

%inline %{
class CBack {
    public:
        virtual int operator()(int x, int y) const {
            return x+y;
        }
        virtual int handle(int x, int y)
        {
            return -1;
        }
        virtual ~CBack() {}
    };

    int callF(CBack* f, int xv, int yv)
    {
        return f->handle(xv, yv);
    }
%}
# test.py
import example

class Mul(example.CBack):
    def handle(self, x: int, y: int) -> int:
        return x * y

print(example.callF(Mul(), 3, 7))
print(str(Mul().handle(3,7)))

输出:

21
21
© www.soinside.com 2019 - 2024. All rights reserved.