Tôi có bộ đếm thời gian biên dịch mà tôi đã sử dụng trong nhiều năm, lấy cảm hứng từ these answers. Nó hoạt động trong C++ 11/3, và như xa như tôi thử nghiệm, tương đối tốt trên các trình biên dịch chính:Bộ đếm thời gian biên dịch trong mẫu lớp
namespace meta
{
template<unsigned int n> struct Count { char data[n]; };
template<int n> struct ICount : public ICount<n-1> {};
template<> struct ICount<0> {};
#define MAX_COUNT 64
#define MAKE_COUNTER(_tag_) \
static ::meta::Count<1> _counter ## _tag_ (::meta::ICount<1>)
#define GET_COUNT(_tag_) \
(sizeof(_counter ## _tag_ (::meta::ICount<MAX_COUNT + 1>())) - 1)
#define INC_COUNT(_tag_) \
static ::meta::Count<GET_COUNT(_tag_) + 2> _counter ## _tag_ (::meta::ICount<2 + GET_COUNT(_tag_)>)
}
Các thử nghiệm compiles and runs perfectly sau (sản lượng dự kiến là 0 1 2 3
):
struct Test
{
MAKE_COUNTER(uu);
static const unsigned int a = GET_COUNT(uu);
INC_COUNT(uu);
static const unsigned int b = GET_COUNT(uu);
INC_COUNT(uu);
static const unsigned int c = GET_COUNT(uu);
INC_COUNT(uu);
static const unsigned int d = GET_COUNT(uu);
};
template<typename T>
void test()
{
std::cout << T::a << " " << T::b << " " << T::c << " " << T::d << "\n";
}
int main()
{
test<Test>();
}
Tuy nhiên, Tôi tìm thấy một trường hợp là tôi thấy một hành vi rất lạ xảy ra với clang và gcc. Nếu bạn thay đổi Test
thành cấu trúc mẫu, hãy lấy một ví dụ (template<int> struct Test
và test<Test<42> >()
trong main
), clang and gcc both fail to compile, phàn nàn rằng tôi đang xác định lại chức năng bộ đếm (trong khi msvc biên dịch nó mà không gặp sự cố). Đối với một số lý do trình biên dịch không tính toán sizeof trong một lớp mẫu.
clang tìm lỗi ở sốthứ ba, trong khi gcc tìm thấy lỗi thứ hai.
tôi tự mở rộng macro này, và:
cho kêu vang, nó mang lại cho
static ::meta::Count<GET_COUNT(uu)+2> _counteruu(::meta::ICount<(sizeof(_counteruu(::meta::ICount<65>())) - 1)+2>); // ^ ^
loại bỏ các dấu ngoặc đơn được gạch dưới giải quyết vấn đề này.
cho gcc: di chuyển
+2
trướcsizeof
là công việc xung quanh chỉ
Những lưu ý đáng buồn là những cách giải quyết dường như không làm việc khi bao gồm trong macro. Nó giống như trình biên dịch chỉ quên cách tính kết quả của sizeof sau một thời gian ...
Tại sao điều này lại xảy ra? Tôi có làm gì sai, hoặc là nó chỉ là lỗi trình biên dịch (kể từ khi clang và gcc thậm chí không báo cáo cùng một dòng)?
Lưu ý: Tôi biết there is a gcc bug about this counter. Câu hỏi không phải là về lỗi này.
(Bỏ qua tất cả các nhận xét trước đây của tôi, hiện đã bị xóa. Chúng không chính xác. Tôi đã mở rộng một số mẫu theo cách thủ công và không nhớ chính xác những thử nghiệm tôi đã làm.) –