窃听作为模板函数的类成员函数

时间:2018-07-09 22:39:35

标签: python c++ swig

该问题基于以下问题:How to instantiate a template method of a template class with swig?

但是,与该问题相比,我尝试包装的代码略有不同:

class MyClass {
  public:
    template <class T>
     void f1(const string& firstArg, const T& value);
};

MyClass 是常规C ++类,具有一个模板函数f1。

尝试包装MyClass :: f1 :,即Swig .i文件

 %template(f1String)    MyClass::f1<std::string>; 

有了上述内容,Python客户端就可以做到

o = MyClass
str1 = "A String"
o.f1String("", str1)

此接口要求Python客户端了解所有不同的f1函数名称,每个名称均取决于类型。不太干净。

可以通过重载(例如在接口文件中扩展)来获得更简洁的接口。

%extend MyClass {
   void f1(const string& s, const string& s1){
          $self->f1(s, s1);
   }
   void f1(const string& s, const int& anInt){
          $self->f1(s, anInt);
   }
}

这允许这样的客户端代码:

o = MyClass
str1 = "A String"
anInt = 34
o.f1("", str1)
o.f1("", anInt)

问题是,有没有办法使用Swig来获取上面的接口(通过扩展),不扩展

1 个答案:

答案 0 :(得分:1)

幸运的是,Python包装器支持重载,因此您可以简单地实例化两个具有相同名称的方法,SWIG将尽其所能在运行时解决重载。有关更多详细信息,请参见文档“ SWIG和C ++”一章中的6.18 Templates

test.i

%module example
%{
#include<iostream>

class MyClass {
public:
    template <class T>
    void f1(const std::string& firstArg, const T& value) {
        std::cout << firstArg << ',' << value << '\n';
    }
};
%}

%include <std_string.i>

class MyClass {
public:
    template <class T>
    void f1(const std::string& firstArg, const T& value);
};

%extend MyClass {
    %template(f1) f1<std::string>;
    %template(f1) f1<int>;
}

test.py

from example import *

o = MyClass()
str1 = "A String"
anInt = 34
o.f1("X", str1)
o.f1("Y", anInt)

要编译和运行的示例工作流程:

$ swig -python -c++ test.i
$ g++ -Wall -Wextra -Wpedantic -I /usr/include/python2.7/ -fPIC -shared test_wrap.cxx -o _example.so -lpython2.7
$ python2.7 test.py
X,A String
Y,34