c++ - 在编译时检测 C++ 代码中的重复工作

标签 c++ metaprogramming

让我们考虑以下代码:

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 中存储一些 bool 标志并每次检查工作是否已经完成,但我想知道是否有某种方法可以在编译时捕获它。因为在编译时已经很清楚工作已经完成。

最佳答案

另一种方法。在 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;
};

类似上面的内容。

关于c++ - 在编译时检测 C++ 代码中的重复工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60901101/

相关文章:

c++ - 使用 MPI/c++ 修改读取的大 .txt 文件?

c++ - Windows EXE/DLL : what is a "packed image"

c++ - 深度优先搜索

python - 如何以编程方式在 Python 中添加实例?

c++ - 哪些库使用通过编译时元编程技术实现的设计模式?

c++ - 如何打印列表 <class*> ls?

python编译错误(绑定(bind)c++)

unit-testing - 在 grails 中元编程的正确方法,以便在单元测试中可用

java - 有哪些独立的 Java 解析器可用?

c++ - 元编程模板递归不递归(编辑重要)