传递成员函数作为参数

时间:2013-02-06 20:45:30

标签: c++ pointers

假设我在一个类中有这个公共方法:

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都没有工作。

我读到了一些关于创建指向该成员函数的指针并将其作为参数传递的内容,但我不太确定该怎么做。

2 个答案:

答案 0 :(得分:2)

你可以像这样使用std :: bind

std::for_each(i, j, std::bind(&MyClass::doSum, this));

答案 1 :(得分: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