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)调用您的指针指向的方法ptr,并将 2 作为其参数传递。同样,关键点是在 . 周围加上括号(self.*ptr)

&最后要记住的一点是,在设置指针 ( ) 的值时不能跳过&Test::fun1,即使使用常规函数也是如此。

如果您使用模板,您可以使您的代码更整洁:

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

在这种情况下不需要 typedef,但是,您仍然必须记住调用中的括号。

如果您使用新的 C++0x 标准进行编译,则可以使用std::functionstd::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 回答