如何传递一个函数,将一个特征向量作为一个参数,并将一个特征向量返回给另一个类/函数

时间:2016-11-11 22:15:05

标签: c++ c++14 eigen

对于上下文,我正在尝试编写一个解决非线性方程组的类(根查找器)。为此,我的接口如下:构造函数接受一个函数,该函数接受一个特征向量并返回一个特征向量(要解决的系统),并将其存储在funcnewt成员中函数采用特征向量(初始猜测),使用该初始猜测运行算法,并返回特征向量r,使func(r) = {0, 0, ..., 0}

现在我按照指示here编写了类的函数:编写模板函数,实现MatrixBase的实例化。我的问题是,如果我还想将一个函数传递给类,我该如何做类似的事情呢?我尝试过的最明显的方法是存储一个私有的std::function对象,并以与我对函数类似的方式对其进行模板化。它没有成功,我不确定如何继续。

class Newt {
private:
    template<typename TR, typename T1, typename T2, typename T3>
    tuple<TR,bool> lnsrch(const MatrixBase<T1> &xold, const double fold, const MatrixBase<T2> &g, MatrixBase<T3> &p, const double stepmax);

    template <typename TR, typename T1, typename T2>
    TR fdjac(const MatrixBase<T1> &x, const MatrixBase<T2> &fvec);

    template <typename TR, typename T1>
    std::function<TR(MatrixBase<T1>)> func;

public:
    template <typename TR, typename T1>
    Newt(std::function<TR(MatrixBase<T1>)> f) : func(f) { };

    template <typename T1, typename T2>
    tuple<T1,bool> newt(const MatrixBase<T2> &xx);
};

我收到以下错误:

g++-6 -c -Wall -O2 -march=native -flto newt.cpp
In file included from newt.cpp:8:0:
newt.h:218:40: error: data member ‘func’ cannot be a member template
  std::function<TR(MatrixBase<T1>)> func;
                                        ^
newt.h: In constructor ‘Newt::Newt(std::function<TR(Eigen::MatrixBase<U>)>)’:
newt.h:222:46: error: class ‘Newt’ does not have any field named ‘func’
  Newt(std::function<TR(MatrixBase<T1>)> f) : func(f) { };
                                              ^~~~
make: *** [newt.o] Error 1

有什么想法吗?我怎么能做我想做的事?完成我想要实现的任何替代方法(编写一个在任意给定函数上运行算法的类“Eigen_Vector f(Eigen_Vector x)”)?

1 个答案:

答案 0 :(得分:0)

如果必须将对函数的引用存储为类成员,则必须将函数类型作为类的模板参数传递,类似于Eigen::LevenbergMarquart所做的。例如:

template<typename Func>
class Newt {
    const Func& func;
  public:
    Newt(const Func& f) : func(f) {}
};

然后你可以编写一个帮助器来自动找出仿函数类型,如:

auto solver = make_newt(my_func);

其中my_func可以是包括lambdas在内的任何内容。