如何避免此代码重复?

时间:2014-05-30 19:53:53

标签: c++ refactoring stdbind

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

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();
}

我可以弄清楚如何“参数化”“其他内容”代码,但问题是对method1method2的调用。我想我必须以某种方式使用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事。建议?

1 个答案:

答案 0 :(得分:3)

使用pointers to member function

#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();
}