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);
}
または元:
、エラーがありますか?呼び出された関数はdouble&を返さないので、operator []はdouble&を返すことはできません。あなたはあなたの "修正"でそれを変更しました。 –
@ manni66、ハ、そうです。問題は '&'にありました。ここでバインドする必要はありませんが、 '(lp。* data)(i、j)'構造は 'data 'として機能し、' TLearnPattern'のメンバーではありません。それはなぜ機能するのですか?点はここのメンバではなく、メンバ関数へのポインタのクラスインスタンスを指します。 –