Estou curioso para saber se é possível garantir, em tempo de compilação, que um método seja chamado em exatamente um local.
Observe que não há problema se a função for chamada mais de uma vez (por exemplo, em um loop) - mas não deve ser chamada em dois loops separados.
Isso pode ser dividido em duas partes. Também estou interessado em soluções que abrangem qualquer parte:
(a) garantir que um método seja chamado em pelo menos um local
(b) garantir que um método seja chamado em mais de um local
Eu tenho controle total sobre a estrutura do código, e diferentes idiomas que alcançam a mesma idéia são bem-vindos.
// class.h
class MyClass {
public:
void my_method();
}
O seguinte não deve ser compilado (nunca chamado)
#include "class.h"
int main() {
MyClass my_class;
}
O seguinte não deve ser compilado (chamado em mais de um local)
#include "class.h"
int main() {
MyClass my_class;
my_class.my_method();
while(true) {
my_class.my_method();
}
}
O seguinte deve ser compilado (chamado exatamente em um local):
#include "class.h"
int main() {
MyClass my_class;
while(true) {
my_class.my_method();
}
}
__COUNTER__macro não padrão para fazer isso. Algo como static_assert(__COUNTER__ == 0); my_class.my_method();. No entanto, o contador é redefinido em cada unidade de tradução, portanto você só pode verificar se a função é chamada uma vez por unidade de tradução.