假设我们有这样一个类:
class OProcess {
...
void Process1();
void Process2(); // call only if Process1 wasn't called
...
}
这样当函数 Process1() 尚未被调用时,函数 Process2() 可以仅被调用。
有没有办法检查在编译时是否正确使用了 Process 类? 即如果可以在 Process2() 之前为 OProcess 对象的某些实例调用 Process1(),编译器必须给出错误。
附言我知道可以有这样的代码:
if (variable == 1000)
Process1();
Process2();
并且编译器无法确定 Process1() 将在 Process2() 之前被调用。但是这里的编译器可以确保 Process1() 可以在 Process2() 之前为某些变量值调用。我需要它来出错或至少发出警告。
最佳答案
简短的回答是有点。
长答案是:C++ 没有实现 Linear Typing ,因此无法在编译时(完全)完成唯一性检查。尽管如此,阅读这个描述给了我们一个技巧:为了在编译器中实现它,语言设计者禁止别名并强制执行消费。
因此,如果您同意允许一些运行时检查,那么这可以通过让进程使用对象来完成:
class OProcess {
public:
};
std::unique_ptr<OProcessed1> process1(std::unique_ptr<OProcess> op);
std::unique_ptr<OProcess> process2(std::unique_ptr<OProcess> op);
其中 OProcessed1
是 OProcess
的代理,呈现一个受限接口(interface),仅公开那些在 OProcess
上允许的操作之后 Process1
被调用。
检查的运行时部分是:
void func(std::unique_ptr<OProcess> op) {
process1(std::move(op));
process2(std::move(op));
}
将编译,即使在从 op
移动之后执行除销毁/分配之外的任何操作都是未定义的行为。
关于c++ - 编译时检查连续函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19742798/