Шаблонные функции Swig Python с выводом типа - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу обернуть следующий код C ++ в модуль Python.

class minimal
{
public:
    minimal()
    {
    }
    ~minimal()
    {
    }

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

Как видите, у меня есть шаблонная функция, и я знаю, что не могу вызывать шаблонную функцию в Python, однако надеюсьчто вызов foo с аргументами int или string будет успешным из-за вывода типа.Тем не менее, в файле .cxx нет foo, но в документации SWIG говорится, что он поддерживает вывод типов

Так что моя цель состоит в том, чтобы кодировать на python так:

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

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

Возможно ли это?Или моя идея совершенно неверна?

1 Ответ

0 голосов
/ 20 февраля 2019

Используйте директиву %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)
...