3

我有两种方法,它们的代码几乎相同,除了它们调用的两种方法(以及我可以轻松参数化的一些其他细节)。但是,这些方法调用具有相同的签名,所以我想我可以将它们概括为一个方法。

class A{
    IApi* m_pApi;
    void M1();
    void M2();
public:
    void DoThings();
}

void A::M1(){
    int i;
    bool b;    
    m_pApi->method1( &i, &b );    
    //Other stuff...
}

void A::M2(){
    int i;
    bool b;    
    m_pApi->method2( &i, &b );
    //Other stuff...
}

void A::DoThings(){
    M1();
    M2();
}

我可以弄清楚如何“参数化”“其他东西”代码,但问题是对method1and的调用method2。我想我必须以std::bind某种方式使用,但我不能做这样的事情......

void A::M( std::function<void(int*,bool*)> f ){
    int i;
    bool b;
    f( &i, &b );
}

void A::DoThings(){
    M( std::bind( ???, m_pApi ) ); //M1
    M( std::bind( ???, m_pApi ) ); //M2
}

这里的问题是它m_pApi不是一个具体的类(它是由一堆具体类实现的接口),所以我不确定我是否可以做通常&Class::Method的事情。建议?

4

1 回答 1

3

使用指向成员函数的指针。

#include <iostream>
using namespace std;

struct IApi {
    void method1(int * i, bool * b) {
        *i = 1; *b = true;
    }
    void method2(int * i, bool * b) {
        *i = 2; *b = false;
    }
};

class A {
    IApi* m_pApi;
    void M(void (IApi::*)(int*, bool*));
public:
    A() : m_pApi(new IApi()) {}
    void DoThings();
};

void A::M(void (IApi::*mptr)(int*, bool*)) {
    int i;
    bool b;    
    (m_pApi->*mptr)( &i, &b );    
    cout << i << ' ' << b << endl;
}

void A::DoThings(){
    M(&IApi::method1);
    M(&IApi::method2);
}

int main() {
    A a;
    a.DoThings();
}
于 2014-05-30T20:09:10.043 回答