C++ 将成员函数指针传递给内部类

C++ Pass member function pointer to inner-class

本文关键字:内部类 指针 成员 函数 C++      更新时间:2023-10-16

使用代理类实现运算符[][]。 适用于可以通过某种double data(int row, in col)方法访问的单个二维数据结构。但是,如果我想有几个data方法,我想使用指向存储在代理内部类TPatternRow中的成员函数的指针:

class TLearnPattern
{
public:
    typedef int (TLearnPattern::* IndexFunction)(int);
    typedef double (TLearnPattern::* DataFunction)(int, int);
    TLearnPattern(TDataSource *source);
    class TPatternRow  ///< Proxy class to implement operator[][]
    {
    public:
        TPatternRow(TLearnPattern& source, int row, DataFunction func) :
            lp(source),
            i(row),
            data(func)
        {}
        double& operator[](int j)       { return (lp.*data)(i, j); }
    private:
        TLearnPattern& lp;
        DataFunction data = &TLearnPattern::in;
        int i;
    };
    TPatternRow operator [](int i) { return TPatternRow(*this, i, &TLearnPattern::in); }
    TPatternRow In(int i)  { return TPatternRow(*this, i, &TLearnPattern::in); }
    TPatternRow Out(int i) { return TPatternRow(*this, i, &TLearnPattern::out); }
    virtual double in(int row, int col) final;
    virtual double out(int row, int col) final;
}

如何语法上正确调用以下行?

double& operator[](int j) { return (lp.*data)(i, j); }

使用 std::bind?如何在构造函数TPatternRow正确绑定它?

还有一些相关的问题:与仅指向成员函数调用的指针相比,bind是否足够快?

像这样解决:

double operator[](int j)
{
    auto dataFunc = std::bind(data, lp, _1, _2);
    return dataFunc(i, j);
}

或原件不带&

double operator[](int j)       { return (lp.*data)(i, j); }