对于上下文,我正在尝试编写一个解决非线性方程组的类(根查找器)。为此,我的接口如下:构造函数接受一个函数,该函数接受一个特征向量并返回一个特征向量(要解决的系统),并将其存储在func
和newt
成员中函数采用特征向量(初始猜测),使用该初始猜测运行算法,并返回特征向量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)
”)?
答案 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在内的任何内容。