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

Incovenience of avoiding duplicate code due to an if statement c++11

我想避免这个用例中的重复代码

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 在某种程度上不方便提取新方法,但我也认为可以使用 lambdas and/or 模板来完成。对于这个用例如何实现 A1()A2() 没有兴趣。

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

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

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

另一个(简化的)示例,使用 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");
 }