2015-04-23 98 views
3

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

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)); 
} 
+1

也参见http://en.cppreference.com/w/cpp/utility/functional/function HTTP来实现/en.cppreference.com/w/cpp/utility/functional/bind – senfen

+2

你可以让'mF1'采取适当的['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function),并传入一个调用'check2(2)'的小lambda。 – BoBTFish

回答

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

'bind'是一种PITA,在大多数情况下只是创建一个小的lambda包装更好。但'绑定'确实回答了这个问题。除非你不解释结果不能用作实际的成员函数指针,你需要改变'mF1'的接口来接受'std :: function'。 – BoBTFish

+0

@BoBTFish更新。 – songyuanyao

0

在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); 
} 
+0

修正了格式化,但我不认为这真的是OP所要求的。我相信他们想要在调用站点修正参数,将一个被1调用的函数转换为一个被调用none的函数(模隐式'this')。 – BoBTFish

相关问题