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

时间:2015-01-07 22:12:19

标签: c++ member-function-pointers function-parameter

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

澄清:' vecfunc'是PTSolver类的非静态成员函数。它需要输入矢量和输出矢量。我想将一个指向这个vecfunc的指针作为参数传递给模板函数" 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;
     }

1 个答案:

答案 0 :(得分: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绑定仿函数。