首页 > 解决方案 > 在编译时检测 C++ 代码中的重复工作

问题描述

让我们考虑以下代码:

struct Foo {
    Foo(Bar b1, Bar b2) : b1(b1), b2(b2) {}
    void work() {
         b1.work();
         b2.work();
         //something
    }
    Bar& b1;
    Bar& b2;
};

struct Bar {
    void work() { /* something */ }
};

int main() {
    Bar a, b;
    a.work();
    //something...
    Foo c(a,b);
    c.work();
    //something...
}

按照我写(或打算写)的方式,a.work() 将被执行两次。但是,假设我,正如程序员所知道的那样,执行两次是浪费执行时间,假设这是一个更复杂的软件的一部分,手动跟踪工作内容太麻烦了没有完成。

显然,我可以在 Bar 中存储一些布尔标志,并每次检查工作是否已经完成,但我想知道,是否有某种方法可以在编译时捕捉到它。因为在编译时已经很清楚工作已经完成了。

标签: c++metaprogramming

解决方案


另一种方法。Bar在对象中有一个函数指针,在work()函数调用中pointer。在构造函数中,将指针定义为实际的工作函数。在函数结束时,将指针重新分配为空函数。

在这种情况下,第一次执行将完成这项工作。但是以后的执行将什么都不做(也不检查boolean标志)

struct Bar {
  typedef void (*Bar::fptr_t)();
  Bar() : fptr(actual_work) {}
  void actual_work() {
    /*something*/;
    fptr = &Bar::empty_work;
  }

  void empty_work() {}
  void work() {fptr();}
  fptr_t fptr;
};

类似上面的东西。


推荐阅读