Мне любопытно, можно ли гарантировать, что во время компиляции метод вызывается ровно в одном месте.
Обратите внимание, что все в порядке, если функция вызывается более одного раза (например, в цикле), но ее не следует вызывать в двух отдельных циклах.
Это может быть разбито на две части, меня также интересуют решения, которые охватывают любую часть:
(а) убедиться, что метод вызывается хотя бы в одном месте
(б) убедиться, что метод вызывается не более чем в одном месте
У меня есть полный контроль над структурой кода, и приветствуются различные идиомы, которые достигают той же идеи.
// 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();. Однако счетчик сбрасывается в каждой единице перевода, поэтому вы можете проверить, что функция вызывается только один раз для каждой единицы перевода.