由于if语句c ++ 11而避免重复代码的不便

时间:2017-09-23 07:29:51

标签: c++ c++11 code-duplication

我想避免使用此用例中的重复代码

class A {
protected: 
  virtual void A1(const void* const s, const std::streamsize n) const;
  inline void A2(const void* const s, const std::streamsize n) const;
};

class B : public A {
private:
  const  char *a;

  void B1(const char *b) {
     if (!b) {
       return;
     }
     if (a < b) {
         A1(a, b-a);
     }
  }

  void B2(const char *b) {
      if (!b) {
       return;
      }
      if (a < b) {
         A2(a, b-a);
     };
  }
};

因此,正如您在B1()B2()中看到的那样,有重复的代码(检查b)除了内部的调用if(注意if条件)是一样的)。我认为这个if在某种程度上不方便提取新方法,但我认为可以使用lambdas和/或模板来完成。关于如何为此用例实施A1()A2(),没有兴趣。

我的问题:避免重复代码的最佳和最简单方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以编写一个接受指向要执行的成员的指针的函数

class B : public A {
private:
    const  char *a;
    using F = void(A::*)(const void* const, const std::streamsize) const;
    void RunFun(F f, const char *b) {
        if (!b) {
            return;
        }
        if (a < b) {
            (this->*f)(a, b-a);
        }

    }


    void B1(const char *b) {
        RunFun(&B::A1,b);
    }

    void B2(const char *b) {
        RunFun(&B::A2,b);
    }
};

答案 1 :(得分:0)

另一个(简化)示例,使用lambda和std::function

#include <cstring>
#include <iostream>
#include <functional>

struct A
 {
   virtual void A1 (char const * const b)
    { std::cout << b << "\n- A1 call" << std::endl; }

   void A2 (char const * const b)
    { std::cout << b << "\n- A2 call" << std::endl; }
 };

struct B : public A
 {
   const char * a;

   std::function<void(char const * const, void(A::*)(char const * const))>
      funcA { [this](char const * const b, void(A::*f)(char const * const))
       { if ( b && std::strlen(b) ) (this->*f)(b); } };

   void B1 (char const * b)
    { funcA(b, &A::A1); }

   void B2 (char const * b)
    { funcA(b, &A::A2); }
 };

int main ()
 {
   B b;

   b.B1("- B1 call");
   b.B2("- B2 call");
 }