C++回调函数转换为成员函数

3
我从未使用过回调函数,但根据我的教授笔记,以下代码应该可行。它不喜欢这个模板并显示“高斯不能出现在常量表达式中”的错误。 注意: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);
}

高斯运算符()的重载签名:
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);

我需要做什么才能使它工作?

我的函数对象能用吗?(我还有另外两个需要实现)


修复你的代码需要解决太多逻辑错误,无法仅通过几个步骤完成。1. 如果matrixAlgo应该是一个成员函数,那么它在非类型模板参数中的签名是无效的;2. 如果matrixAlgo应该是一个非类型模板参数,那么至少它所在的类应该作为类型模板参数显式传递;3. 调用matrixAlgo将需要一个参数对象;4. 由于operator()是一个函数模板,你需要显式实例化它以获取其地址;5. ...;6. ...;7. ...。请尽量提供更多细节,说明您需要什么以及您的设想是什么样的。 - Piotr Skotnicki
1
我建议您按照此处所示的方式进行重写:http://coliru.stacked-crooked.com/a/ca738757eb36bebd - Piotr Skotnicki
1个回答

1
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);

大卫:我发现我很困惑,我应该通过某个算法接口将算法函数对象传递给dir.solve()。感谢您的帮助。 - Daniel Grooms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接