Tôi tò mò về việc liệu có thể đảm bảo tại thời điểm biên dịch rằng một phương thức được gọi ở chính xác một nơi không.
Lưu ý rằng sẽ ổn nếu hàm được gọi nhiều lần (ví dụ: trong một vòng lặp) - nhưng không nên gọi nó trong hai vòng riêng biệt.
Điều này có thể được chia thành hai phần, tôi cũng quan tâm đến các giải pháp bao gồm một trong hai phần:
(a) đảm bảo một phương thức được gọi ở ít nhất một nơi
(b) đảm bảo một phương thức được gọi ở nhiều nhất một nơi
Tôi có toàn quyền kiểm soát cấu trúc của mã và các thành ngữ khác nhau đạt được cùng một ý tưởng đều được chào đón.
// class.h
class MyClass {
public:
void my_method();
}
Sau đây không nên biên dịch (không bao giờ được gọi)
#include "class.h"
int main() {
MyClass my_class;
}
Sau đây không nên biên dịch (được gọi ở nhiều nơi)
#include "class.h"
int main() {
MyClass my_class;
my_class.my_method();
while(true) {
my_class.my_method();
}
}
Sau đây sẽ biên dịch (được gọi chính xác ở một nơi):
#include "class.h"
int main() {
MyClass my_class;
while(true) {
my_class.my_method();
}
}
__COUNTER__macro không chuẩn để làm điều này. Một cái gì đó như static_assert(__COUNTER__ == 0); my_class.my_method();. Tuy nhiên, bộ đếm đặt lại trong mỗi đơn vị dịch để bạn chỉ có thể kiểm tra chức năng được gọi một lần cho mỗi đơn vị dịch.