Мені цікаво, чи можна за час компіляції забезпечити виклик методу саме в одному місці.
Зауважте, що це нормально, якщо функція викликається декілька разів (наприклад, у циклі) - але вона не повинна викликатися у двох окремих циклах.
Це можна розбити на дві частини, мене також цікавлять рішення, які охоплюють будь-яку частину:
(a) забезпечення того, що метод викликається принаймні в одному місці
(b) забезпечення методу виклику щонайменше в одному місці
Я маю повний контроль над структурою коду, і різні ідіоми, які досягають тієї самої ідеї, вітаються.
// class.h
class MyClass {
public:
void my_method();
}
Далі не слід збирати (ніколи не називатись)
#include "class.h"
int main() {
MyClass my_class;
}
Далі не слід компілювати (викликається у більш ніж одному місці)
#include "class.h"
int main() {
MyClass my_class;
my_class.my_method();
while(true) {
my_class.my_method();
}
}
Складається наступне (називається саме в одному місці):
#include "class.h"
int main() {
MyClass my_class;
while(true) {
my_class.my_method();
}
}
__COUNTER__макрос для цього. Щось подібне static_assert(__COUNTER__ == 0); my_class.my_method();. Однак лічильник скидається в кожну одиницю перекладу, щоб ви могли лише перевірити, чи функція викликається один раз на одиницю перекладу.