我从未使用过回调函数,但根据我的教授笔记,以下代码应该可行。它不喜欢这个模板并显示“高斯不能出现在常量表达式中”的错误。
注意:GaussElim是一个函数对象(在之前的代码中gauss(mx,vector)有效)。
DirichletSolver模板回调函数:
高斯运算符()的重载签名:
DirichletSolver模板回调函数:
template <class T, Vector<T> matrixAlgo(const AbstractMatrix<T>&, const Vector<T>)>
Vector<T> DirichletSolver::solve(const AbstractMatrix<T>& mx, const Vector<T> vect)
{
return matrixAlgo(mx, vect);
}
高斯运算符()的重载签名:
template <class T>
Vector<T> operator()(const AbstractMatrix<T>& mx, const Vector<T> vect);
以下是驱动程序代码:
GaussElim gauss;
DirichletSolver dir;
SymMatrix<double> mx;
Vector<double> vect;
...
dir.solve<gauss.operator()>(mx, vect);
我需要做什么才能使它工作?
我的函数对象能用吗?(我还有另外两个需要实现)
matrixAlgo
应该是一个成员函数,那么它在非类型模板参数中的签名是无效的;2. 如果matrixAlgo
应该是一个非类型模板参数,那么至少它所在的类应该作为类型模板参数显式传递;3. 调用matrixAlgo
将需要一个参数对象;4. 由于operator()
是一个函数模板,你需要显式实例化它以获取其地址;5. ...;6. ...;7. ...。请尽量提供更多细节,说明您需要什么以及您的设想是什么样的。 - Piotr Skotnicki