c++ - 在编译时检测 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 中存储一些布尔标志,并每次检查工作是否已经完成,但我想知道,是否有某种方法可以在编译时捕捉到它。因为在编译时已经很清楚工作已经完成了。
解决方案
另一种方法。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;
};
类似上面的东西。
推荐阅读
- laravel - Laravel 5.7 使用空关系连接查询
- matlab - 如何使用 powershell 处理 Matlab 生成的 .dat 文件
- c# - 如何获取当前使用的网络适配器
- asp.net - 当我在 WCF 服务中运行简单方法时,“/”应用程序中的服务器错误
- vue.js - 没有 Webpack 的 Vuejs 的简约构建设置
- javascript - CSS/JS:使用 vanilla JS 向下和向上滑动过渡
- php - 覆盖 woocommerce 主题没有效果
- sql - 表中的日期列
- git - 我是否必须将 gh-pages 合并到 master 才能发布带有 dist 文件夹的存储库?
- database - NoSQL (DynamoDB) 数据库设计