具有可变参数模板的自动参数类型推导

时间:2015-03-06 13:38:28

标签: c++ c++11 variadic-templates

我目前正在编写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不包含参数包

有没有任何规范的方法来实现我在这里尝试做的事情?

0 个答案:

没有答案