让我们考虑以下代码:
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/