Python 通过SWIG传递函数指针数组

Python 通过SWIG传递函数指针数组,python,c++,swig,Python,C++,Swig,在的帮助下,我创建了一个简单的示例,说明如何通过Python将一个函数指针传递给函数。特别是 double f(double x) { return x*x; } double myfun(double (*f)(double x)) { fprintf(stdout, "%g\n", f(2.0)); return -1.0; } 我可以打电话 import test test.f(13) test.myfun(test.f) 并取得了预期的效果 现在,我想更改myfun的签

在的帮助下,我创建了一个简单的示例,说明如何通过Python将一个函数指针传递给函数。特别是

double f(double x) {
  return x*x;
}

double myfun(double (*f)(double x)) {
  fprintf(stdout, "%g\n", f(2.0));
  return -1.0;
}
我可以打电话

import test
test.f(13)
test.myfun(test.f)
并取得了预期的效果

现在,我想更改
myfun
的签名,以允许函数指针数组(所有指针都具有相同的签名),例如


我制作了下面的测试用例来说明您正在尝试做什么。它有一个真正的
myfun(const std::vector&)
实现,让生活更有趣:

#包括
双g(双x){
返回-x;
}
双f(双x){
返回x*x;
}
类型定义双(*pfn_t)(双);
std::vector myfun(常数std::vector&funs,常数双d){
std::载体ret;
净储备(funs.size());
用于(自动和功能:funs)
后置炮台(fn(d));
返回ret;
}
我希望我们需要做的就是使用:

%include <std_vector.i>
%template(FunVec) std::vector<double(*)(double)>;
%template(DoubleVec) std::vector<double>;
%include "test.h"
基本上,所有这些都是为函数指针类型的向量添加一个“in”类型映射。该类型映射只是迭代Python提供的输入,并从Python iterable构建一个临时的
std::vector

这足以使以下Python按预期工作:

导入测试
打印测试.g
打印测试.f
打印测试.g(666)
打印测试.f(666)
打印test.myfun([test.g,test.f],123)

@πνταῥεῖ 基本的工作示例是相同的,但问题是不同的。请取消标记为dup。请首先改进您的问题。@NicoSchlömer您可以使用为该问题提供的基本代码,要支持多个签名,您可以做的是保留一个函数指针数组,并且无论何时分配python函数,都需要将签名指定为受支持的签名之一。感谢@JensMunk的评论。我不理解多重签名提示——事实上,我想要传递的所有函数都应该有相同的签名。我澄清了这方面的问题。我希望这个问题的答案是“只使用
%template(PfnVec)std::vector;
,但这似乎不能正常工作。查看解决方法。
double myfun(std::vector<double (*)(double)>)
test.myfun([test.f, test.g])
%include <std_vector.i>
%template(FunVec) std::vector<double(*)(double)>;
%template(DoubleVec) std::vector<double>;
%include "test.h"