2013-05-26 29 views
6
template <int N> 
struct Factorial { 
    enum { value = N * Factorial<N - 1>::value }; 
}; 

template <> 
struct Factorial<0> { 
    enum { value = 1 }; 
}; 


const int x = Factorial<4>::value; // == 24 
const int y = Factorial<0>::value; // == 1 

Sau khi tiền biên dịch, nếu chúng ta kỳ diệu có thể nhìn thấy những gì các trình biên dịch tạo ra, sẽ chúng tôi thực sự thấy:Mã nguồn thực tế mà mẫu này tạo ra trông như thế nào?

const int x = 24; 
const int y = 1; 

Và chúng ta sẽ thấy các định nghĩa thực tế cho struct Factorial, nhiều trong số này? Nếu họ trông như thế nào? Tôi đang cố gắng quấn đầu của tôi xung quanh phần này của quá trình lập trình meta.

+0

'thừa <901> :: giá trị' rơi tôi DEV-C++: Lỗi: template instantiation sâu vượt quá tối đa 900 – johnchen902

Trả lời

1

Sử dụng g++ -fdump-tree-original trên mã này, tôi thấy kết quả sau đây, mà đối với trường hợp này dường như để khẳng định nghi ngờ của bạn:

;; Function int main() (null) 
;; enabled by -tree-original 



{ 
    const int x = 24; 
    const int y = 1; 

    <<cleanup_point const int x = 24;>>; 
    <<cleanup_point const int y = 1;>>; 
} 
return <retval> = 0; 
+0

Thú vị và không có mã nào được tạo cho 'struct Factorial'? – johnbakers

+0

Tại sao 'y' được dọn dẹp sau' x'? Không nên hủy bỏ trật tự hủy diệt? – greatwolf

+0

@Fellowshee, bạn mong muốn tạo mã nào? Không có biến tĩnh nào trong đó cần không gian, cũng như không có hàm nào cần mã, cũng như không có bất kỳ trường hợp nào của cấu trúc được xây dựng. Tất cả các trình biên dịch cần làm là đánh giá giá trị enum nào đang được nhắc tới, mà nó có thể dễ dàng thực hiện tại thời gian biên dịch. Trước khi giai đoạn này, một sự mở rộng diễn ra mà tạo ra các định nghĩa hợp lý cho Factorial <24> xuống Factorial <0>, nhưng chúng không tạo ra bất kỳ mã nào và không cần thêm nữa. –

Các vấn đề liên quan