2017-05-12 14 views
0

プロキシクラスを使用して演算子[] []を実装しています。いくつかのdouble data(int row, in col)メソッドでアクセスできる単一の2次元データ構造に対してうまく動作します。私はいくつかのdataメソッドを持つようにしたい場合は、私は、プロキシインナークラスTPatternRowに格納されたメンバ関数へのポインタを使用したい:文法的に正しく行を次のよう呼び出すことC++ Passメンバー関数内部クラスへのポインタ

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がバインド::?どのように正しくTPatternRowコンストラクタでこれをバインドするには?

そして、いくつかの関連する質問:bindはメンバー関数呼び出しのポインタに比べて十分速く動作しますか? &なし

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

または元:

+0

、エラーがありますか?呼び出された関数はdouble&を返さないので、operator []はdouble&を返すことはできません。あなたはあなたの "修正"でそれを変更しました。 –

+0

@ manni66、ハ、そうです。問題は '&'にありました。ここでバインドする必要はありませんが、 '(lp。* data)(i、j)'構造は 'data 'として機能し、' TLearnPattern'のメンバーではありません。それはなぜ機能するのですか?点はここのメンバではなく、メンバ関数へのポインタのクラスインスタンスを指します。 –

答えて

0

は次のように解決

double operator[](int j)  { return (lp.*data)(i, j); } 
関連する問題