我目前正在编写C ++< - >使用boost::python
的python包装器。在c ++中,我使用Eigen
进行数值计算,而我在python中使用numpy
。为了能够轻松地为我的C ++代码创建包装器,我想对每个参数应用转换(例如从python类型转换为C ++类型),然后调用相应的函数。
假设C ++方法和转换都是静态方法'call'的结构,即简化
struct cppFunction {
static double call(double a) { return a * 10; }
};
struct T1 {
static double call(int a) { return static_cast<double>(a); }
};
然后我希望能够定义一个我可以传递给boost::python
auto wrappedFunction = &wrap<CppFunction, T1>>
要做到这一点,我需要自动推导CppFunction
的输入参数,我可以用特征来做:
template <class F> struct ArgType;
template <class R, class T>
struct ArgType<R (*)(T)> {
typedef T argument_type;
};
只有1个参数,可以实现为:
template <typename Function, typename T1>
auto wrap(typename ArgType<decltype(&T1::call)>::argument_type a1)
-> decltype(Function::call(T1::call(a1))) {
return Function::call(T1::call(a1));
}
};
然而,在具有可变数量输入的一般情况下,编写是很自然的:
struct cppFunction {
static double call(double a, double b, double c) { return a * b * c; }
};
template <typename Function, typename... T>
auto wrap(typename ArgType<decltype(&T::call)>::argument_type... args)
-> decltype(Function::call(T::call(args)...)) {
return Function::call(T::call(args)...);
}
auto wrappedFunction = &wrap<CppFunction, T1, T1, T1>>
然而,这在我的编译器(VS2013)上失败了,抱怨
ArgType :: argument_type不包含参数包
有没有任何规范的方法来实现我在这里尝试做的事情?