将成员函数(非静态)作为参数传递给模板函数

Passing member function (non-static) as a parameter to template function

本文关键字:函数 参数传递 成员 静态      更新时间:2023-10-16

我正在尝试定义一个指向非静态成员函数的指针,并将指针与类对象一起传递给模板函数,该函数将再次发送成员函数以进行模板结构操作。它一直给我类型不匹配错误。请帮忙!

澄清:"vecfunc"是类PTSolver的非静态成员函数。它作为输入向量和输出向量。我想将指向这个 vecfunc 的指针作为模板函数 'newt' 的参数传递给模板函数 'newt',它也将向下传递给模板结构操作 'fmin()'。在整个传递过程中,我需要提供有关 PTSolver 对象"ptsolver"的信息,因为它不是静态成员函数。但我做不到...

    template <class T>
    struct NRfmin {
        VecDoub fvec;
        T &func;
        int n;
        NRfmin(T &funcc) : func(funcc) {}
        double operator() (VecDoub_I &x) {
        n=x.size();
        double sum=0.0;
        fvec=func(x);
        for (int i = 0;i<n;i++) sum += SQR(fvec[i]);
        return 0.5*sum;
        }
    };
    template <class T>
    void newt(VecDoub_IO &x, bool &check, T &vecfunc, PTSolver &obj){
        NRfmin<T> fmin(obj.*vecfunc);
        VecDoub &fvec=fmin.fvec;
        f=fmin(x);
        ...
    }
    class PTSolver {
    public:
        PTSolver() = default;
        virtual ~PTSolver() = default;
        void solve();
        VecDoub vecfunc(VecDoub_I);
    };
    VecDoub PTSolver::vecfunc(VecDoub_I x) {
        int n=x.size();
        VecDoub results(n);
        for (int i=0;i<n;i++) {
            results[i]=2.0*x[i];
        }
        return results;
    }
    int main() {
        VecDoub initGuess(2);
        initGuess[0]=4.4;
        initGuess[1]=5.5;
        bool check;
        //function<VecDoub(PTSolver*, VecDoub_I)> Func=&PTSolver::vecfunc;
       typedef VecDoub (PTSolver::*PMemFnc)(VecDoub_I x);
       PMemFnc Func;
       PTSolver ptsolver;
       newt<PMemFnc>(initGuess, check, Func, ptsolver);
       return 0;
     }

您有一个类型不匹配:

template <class T>
struct NRfmin {
    NRfmin(T &funcc) : func(funcc) {}
};
template <class T>
void newt(VecDoub_IO &x, bool &check, T &vecfunc, PTSolver &obj){
    NRfmin<T> fmin(obj.*vecfunc);
    ..
};

在这两种情况下,T都是指向成员函数的指针,但您正在构造fmin,而这些东西绝对不是T&(它甚至不是一个有效的表达式)。要么你的意思是只转发指针,在这种情况下:

NRfmin<T> fmin(vecfunc);

或者你想传递NRfmin绑定函子。