【问题标题】:Incovenience of avoiding duplicate code due to an if statement c++11由于if语句c ++ 11避免重复代码的不便
【发布时间】:2023-04-03 13:54:01
【问题描述】:

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

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() 中看到的那样,除了 if 内部的调用(注意 if 条件相同)之外,存在重复的代码(检查 b)。我认为这if使提取新方法有些不便,但我认为可以使用 lambdas 和/或模板来完成。对于此用例如何实现 A1()A2() 没有任何意义。

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

【问题讨论】:

  • 将重复的代码分离到另一个函数中。
  • 我编辑了帖子,我认为不应该将 b 的条件移到另一个函数中。
  • 那你在烦恼什么?并非所有简单语句的代码重复都需要(并且应该)避免。
  • 好吧,如果可以轻松完成,为什么不呢?
  • 假设a 是一个指针,a &lt; b 要求b 为非NULL,因此您可以完全删除您的第一个if 语句。除此之外,您是否应该以某种方式合并或模板化函数取决于它们的作用以及您希望界面是什么样的。

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


【解决方案1】:

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

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

【讨论】:

  • 我的想法是添加一个标签来调度而不是使用指针。但是这种方式更容易阅读并保存 dispatch-if。 +1
  • 我有一个问题:为什么在(this-&gt;*f)(a, b-a) 中需要this 而不仅仅是f(a, b-a)
  • 由于是指向成员函数的指针,需要通过指针指定调用该函数的对象
  • 在这种情况下this 指的是对象A,对吧?
  • 实际上这是 B* 类型,并且指针也作为指向 B:: 成员的指针传递 - 但由于 B 不直接实现 A1 - 使用的实现取自基类 A跨度>
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多