如何将带有 args 的成员函数作为参数传递给另一个成员函数?
how to pass a member function with args as an argument to another member function?
以下示例适用于传递不带参数的成员函数指针。有人可以解释我如何用参数来做到这一点吗?如果可能的话,我们也可以传递可变数量的参数吗?
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));
}
不能,只能在调用的时候传参。如:
void test::mF1(check_fun_type ptr) {
(this->*ptr)(2);
}
编辑
您可以使用std::bind
调用函数,其中一些参数预先绑定到arguments,例如:
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));
}
在 C++11 中你可以使用
template <class F, class... Args>
void mFx(F ptr, Args... args)
{
(this->*ptr)(args...);
}
传递任意类型和可变数量参数的成员函数指针。
在 C++98 中,可以通过为每个参数数量
重载方法来实现类似的功能
template <class F>
void mFx(F ptr)
{
(this->*ptr)();
}
template <class F, class A1>
void mFx(F ptr, A1 a1)
{
(this->*ptr)(a1);
}
template <class F, class A1, class A2>
void mFx(F ptr, A1 a1, A2 a2)
{
(this->*ptr)(a1, a2);
}
以下示例适用于传递不带参数的成员函数指针。有人可以解释我如何用参数来做到这一点吗?如果可能的话,我们也可以传递可变数量的参数吗?
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));
}
不能,只能在调用的时候传参。如:
void test::mF1(check_fun_type ptr) {
(this->*ptr)(2);
}
编辑
您可以使用std::bind
调用函数,其中一些参数预先绑定到arguments,例如:
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));
}
在 C++11 中你可以使用
template <class F, class... Args>
void mFx(F ptr, Args... args)
{
(this->*ptr)(args...);
}
传递任意类型和可变数量参数的成员函数指针。
在 C++98 中,可以通过为每个参数数量
template <class F>
void mFx(F ptr)
{
(this->*ptr)();
}
template <class F, class A1>
void mFx(F ptr, A1 a1)
{
(this->*ptr)(a1);
}
template <class F, class A1, class A2>
void mFx(F ptr, A1 a1, A2 a2)
{
(this->*ptr)(a1, a2);
}