Swig Python模板具有类型扣除功能

swig python template functions with type deduction

本文关键字:类型 功能 Python Swig      更新时间:2023-10-16

我想在C 代码后包装到Python模块中。

class minimal
{
public:
    minimal()
    {
    }
    ~minimal()
    {
    }
    template<class T>
    void foo(T a)
    {
        auto z = a; 
    }
};

您可以看到,我具有模板函数,而且我知道我无法在Python中调用模板函数,但是我希望使用INT或字符串参数调用FOO会因为类型的扣除而获得成功。.cxx文件中仍然没有FOO,但是SWIG文档说,它支持类型扣除

所以我的目标是像这样的python代码:

#C++ analog: minimal.foo(123)
minimal().foo(123) 
#C++: to minimal().foo(0.1)
minimal().foo(0.1) 

有可能吗?还是我的想法完全错了?

使用%template指令指示SWIG创建特定模板的实现。只有声明的模板实例可用。

示例:

%module test
%inline %{
class minimal
{
public:
    minimal()
    {
    }
    ~minimal()
    {
    }
    template<class T>
    void foo(T a)
    {
        auto z = a; 
    }
};
%}
%template(foo) minimal::foo<int>;
%template(foo) minimal::foo<double>;

示例:

>>> import test
>>> m=test.minimal()
>>> m.foo(1)
>>> m.foo(1.5)
>>> m.foo('abc')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:test.py", line 115, in foo
    return _test.minimal_foo(self, *args)
NotImplementedError: Wrong number or type of arguments for overloaded function 'minimal_foo'.
  Possible C/C++ prototypes are:
    minimal::foo< int >(int)
    minimal::foo< double >(double)