Zastanawiam się, czy w czasie kompilacji można upewnić się, że metoda jest wywoływana dokładnie w jednym miejscu.
Zauważ, że jest OK, jeśli funkcja jest wywoływana więcej niż raz (np. W pętli) - ale nie powinna być wywoływana w dwóch oddzielnych pętlach.
Można to podzielić na dwie części, interesują mnie również rozwiązania obejmujące każdą część:
(a) upewnij się, że metoda jest wywoływana w co najmniej jednym miejscu
(b) upewnij się, że metoda jest wywoływana w co najwyżej jednym miejscu
Mam pełną kontrolę nad strukturą kodu i mile widziane są różne idiomy, które osiągają ten sam pomysł.
// class.h
class MyClass {
public:
void my_method();
}
Poniższe nie powinny się kompilować (nigdy nie są wywoływane)
#include "class.h"
int main() {
MyClass my_class;
}
Poniższe nie powinny się kompilować (wywoływane w więcej niż jednym miejscu)
#include "class.h"
int main() {
MyClass my_class;
my_class.my_method();
while(true) {
my_class.my_method();
}
}
Powinny się kompilować (wywoływane dokładnie w jednym miejscu):
#include "class.h"
int main() {
MyClass my_class;
while(true) {
my_class.my_method();
}
}
__COUNTER__
makra. Coś jak static_assert(__COUNTER__ == 0); my_class.my_method();
. Jednak licznik resetuje się w każdej jednostce tłumaczeniowej, dzięki czemu można sprawdzić, czy funkcja jest wywoływana tylko raz na jednostkę tłumaczeniową.