如何将带有args的成员函数作为参数传递给另一个成员函数?

时间:2015-04-23 09:27:14

标签: c++ function-pointers member-function-pointers

以下示例适用于传递不带参数的成员函数指针。有人可以用参数解释我如何做到这一点吗?如果有可能我们还可以传递可变数量的参数吗?

class test {
public:
  typedef void (test::*check_fun_type)();
  //typedef void (test::*check_fun_type)(int);

  void mF1(check_fun_type ptr);
  void check1();
  void check2(int v1);
};

void test::check1() {
  std::cout << "check1" << std::endl;
}

void test::check2(int v1) {
  std::cout << "check2 " << v1 << std::endl;
}

void test::mF1(check_fun_type ptr) {
  (this->*ptr)();
}

int main() {
  test t1;
  t1.check1();
  t1.check2(2);
  t1.mF1(&test::check1);
  //t1.mF1((&test::check2)(2));
}

2 个答案:

答案 0 :(得分:4)

不,你只能在调用它时传递参数。如:

void test::mF1(check_fun_type ptr) {
    (this->*ptr)(2);
}

修改

您可以使用std::bind来调用函数,并将其某些参数预先绑定到参数,例如:

test t1;
auto f = std::bind(&test::check2, &t1, 2);
f();

对于您的情况,您需要将test::mF1的参数类型更改为std::function。如:

typedef std::function<void(test*)> check_fun_type;

void test::mF1(check_fun_type ptr) {
    ptr(this);
}

int main() {
    test t1;
    t1.mF1(std::bind(&test::check2, _1, 2));
}

DEMO

答案 1 :(得分:0)

在C ++ 11中,您可以使用

font-family: "Eras ITC", "Eras Light ITC", Sans-Serif;

传递任何类型和可变数量的参数的成员函数指针 在C ++ 98中,可以通过为每个参数数量重载方法来实现类似的功能

template <class F, class... Args>
void mFx(F ptr, Args... args)
{
    (this->*ptr)(args...);
}