成员函数的 C++ 回调函数
C++ Callback Function to Member Function
我从未使用过回调,但根据我教授的笔记,下面的代码应该可以工作。它不喜欢模板并且有关于 "gauss cannot appear in a constant-expression." 的错误
注意:GaussElim 是一个函数对象(gauss(mx, vector) 在前面的代码中起作用)。
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);
}
Gauss operator() 重载签名:
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);
我需要做什么才能让它发挥作用?
它对我的仿函数有用吗? (我还有两个要实现)
solve
的第二个模板参数需要一个函数,不是 一个仿函数。对于给定的模板参数 T
.
,特别是具有签名 Vector<T> ()(const AbstractMatrix<T>&, const Vector<T>)
的函数
gauss.operator()
没有意义,也许你的意思是 GaussElim::operator()
但这也不起作用,因为它是一个成员函数。如果你可以将 GaussElim::operator()
的任何实现写成一个自由函数,你就可以将它用作模板参数:
template <class T>
Vector<T> myFunc(const AbstractMatrix<T>& mx, const Vector<T> vect)
{
// contents of GaussElim::operator()
}
然后用
调用
dir.solve<double, myFunc>(mx, vect);
我从未使用过回调,但根据我教授的笔记,下面的代码应该可以工作。它不喜欢模板并且有关于 "gauss cannot appear in a constant-expression." 的错误 注意:GaussElim 是一个函数对象(gauss(mx, vector) 在前面的代码中起作用)。
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);
}
Gauss operator() 重载签名:
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);
我需要做什么才能让它发挥作用?
它对我的仿函数有用吗? (我还有两个要实现)
solve
的第二个模板参数需要一个函数,不是 一个仿函数。对于给定的模板参数 T
.
Vector<T> ()(const AbstractMatrix<T>&, const Vector<T>)
的函数
gauss.operator()
没有意义,也许你的意思是 GaussElim::operator()
但这也不起作用,因为它是一个成员函数。如果你可以将 GaussElim::operator()
的任何实现写成一个自由函数,你就可以将它用作模板参数:
template <class T>
Vector<T> myFunc(const AbstractMatrix<T>& mx, const Vector<T> vect)
{
// contents of GaussElim::operator()
}
然后用
调用dir.solve<double, myFunc>(mx, vect);