2

クラス内にこのパブリックメソッドがあるとしましょう:

uli returnSum()
{
    for_each(i, j, doSum);
    return this->sum;
}

void doSum(short int y)は、まったく同じクラスのプライベート メソッドです。for_each の引数として渡すにはどうすればよいですか?

上記の構文を使用すると、error: must use .* or ->* to call pointer-to-member function in __f (...)'. どちらも機能していませんthis->*doSum

そのメンバー関数へのポインターを作成し、それを引数として渡すことについて何かを読みましたが、その方法がよくわかりません。

4

2 に答える 2

2

次の例を見てください。

#include <iostream>
using namespace std;

class Test {
  public:
    int fun1(int x) { return x+1; }
};

typedef int (Test::*PtrType)(int);

void call(Test& self, PtrType prt) {
    cout << (self.*ptr)(2) << endl;
}

int main() {
    Test t;
    call(t, &Test::fun1);
    return 0;
}

この行typedef int (Test::*PtrType)(int);は、型の単純な名前をクラス メソッドに定義します。括弧(Test::*PtrType)は重要です。PtrTypeは新しく定義された型です (typedef を使用せずに署名全体をcall関数の引数に入れることもできますが、そのようなアプローチは強くお勧めしません)。

この式(self.*ptr)(2)は、 pointer が指すメソッドを呼び出し、ptr引数として 2 を渡します。ここでも重要な点は、括弧を付けること(self.*ptr)です。

覚えておくべき最後のポイントは、通常の関数で可能であっても&、ポインター ( ) の値を設定するときにスキップできないことです。&Test::fun1

テンプレートを使用すると、コードを少しきれいにすることができます。

template <typename PtrT>
void call(Test& self, PtrT ptr) {
    cout << (self.*ptr)(2) << endl;
}

このような場合、typedef は必要ありませんが、呼び出しの括弧について覚えておく必要があります。

新しい C++0x 標準でコンパイルする場合は、std::functionまたはを使用できますstd::bind

于 2013-02-06T21:03:10.067 に答える
2

このように std::bind を使用できます

std::for_each(i, j, std::bind(&MyClass::doSum, this));
于 2013-02-06T20:50:12.220 に答える