Trong C ++, SFINAE và siêu lập trình có chủ ý hay chỉ là sản phẩm phụ của các mẫu?


11

SFINAEtemplatesiêu lập trình có thể làm những điều tuyệt vời và nhiều thư viện cũng sử dụng chúng đáng kể.

Trong lịch sử cả hai "khái niệm ma thuật" này được cố tình giới thiệu / hỗ trợ trong C ++? Hoặc chúng chỉ được phát hiện sau đó là sản phẩm phụ hữu ích (sản phẩm phụ) của templatelập trình ban đầu ?

Câu trả lời:


19

Khoảng một thập kỷ trước sau một ngày hội nghị, tôi tình cờ thấy mình trong một quán rượu với Erwin Unruh và một vài người khác và tôi đã hỏi anh ấy về chương trình mà VJovic đã đề cập . Chúng tôi đã có một vài loại bia vào thời điểm đó, đó là một cuộc họp không chính thức, và nó đã sống trong đầu tôi trong một thập kỷ, vì vậy hãy mang theo một hạt muối, nhưng theo ký ức của tôi:

Ông nói rằng họ đã thêm các tính năng mẫu để phục vụ STL tốt hơn. Theo ông, một số / nhiều người trong ủy ban cảm thấy rằng họ đang tạo ra một cái gì đó mà không biết khả năng đầy đủ của nó. Bản thân anh ta nghi ngờ rằng tất cả các công cụ mẫu, đặc biệt là chuyên môn hóa một phần, tạo thành một ngôn ngữ hoàn chỉnh Turing, và anh ta luôn có ý định làm một bằng chứng chính thức về điều đó, nhưng không bao giờ làm như vậy.

Thay vào đó một đêm tại một cuộc họp tiêu chuẩn hóa, ông đã nghĩ ra điều đó chương trình đó in các số nguyên tố dưới dạng thông báo lỗi (một phiên bản nên hoạt động với các trình biên dịch hiện đại ở đây ) mà nó đã tính toán trong quá trình biên dịch. Là một chương trình meta mẫu, nó không ấn tượng lắm bởi các tiêu chuẩn ngày nay, nhưng cuối cùng nó là lần đầu tiên. Ai đó đã thực hiện những gì anh ta coi là một trò đùa bằng cách chính thức gửi chương trình để nó trở thành một tài liệu tiêu chuẩn hóa ISO chính thức.

Tôi nhớ rằng tôi đặc biệt hỏi anh ấy về phản ứng của Bjarne Stroustrup đối với chương trình, và để đáp lại Erwin đã bắt chước anh ấy bằng cách che mắt bằng tay. :)

Nhìn nhận lại, tôi rất tiếc tôi đã không hỏi Todd Veldhuizen , người cũng tham gia hội nghị đó, làm thế nào anh ta đưa ra các mẫu biểu hiện . (Anh ấy chắc chắn là một người tốt để nói chuyện.) Nhưng tôi trẻ hơn nhiều, và để cơ hội suốt đời trôi qua.:(


+1, trải nghiệm thú vị. Họ đã nói gì về SFINAE chưa?
iammilind

@iammilind: Tôi nghĩ SFINAE chỉ là một trong những tính năng mà anh ấy đề cập đã được thêm vào để hỗ trợ STL tốt hơn, mặc dù biệt danh "SFINAE" chỉ được đặt ra nhiều năm sau đó.
sbi

11

Năm 1994 trong một cuộc họp của ủy ban tiêu chuẩn hóa c ++, E. Unruh đã phát hiện ra rằng các mẫu có thể được sử dụng để tính toán một cái gì đó tại thời gian biên dịch. Ông đã viết một chương trình in số nguyên tố. Phần hấp dẫn của bài tập này là việc sản xuất các số nguyên tố được trình biên dịch thực hiện trong quá trình biên dịch chứ không phải trong thời gian chạy. Mặc dù chương trình này không hoàn toàn di động, chương trình đã chỉ ra rằng cơ chế khởi tạo mẫu là một ngôn ngữ đệ quy nguyên thủy có thể thực hiện các tính toán không tầm thường trong thời gian biên dịch.

Đoạn trích này được lấy từ "mẫu c ++" của Vandevoorde và Josuttis (chương 17).

Như bạn có thể thấy, nó được phát hiện sớm và sức mạnh của nó được nhận ra ngay lập tức.


2
Tốt một. Loại bài viết này tôi cũng đã đọc trên internet, đừng nhớ nguồn. Điều này có đúng với SFINAE không?
iammilind

@iammilind Ý bạn là gì với "Điều này có đúng với SFINAE không?"
BЈовић

1
SFINAE thường cần một số hỗ trợ từ trình biên dịch. Vì vậy, nó có thể, nó có thể không được phát hiện tình cờ.
iammilind

@iammilind tôi thấy bài viết của một InformIT mà có một văn bản tương tự từ cuốn sách: informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић

@iammilind Chỉnh sửa câu trả lời. Tôi sẽ nói rằng nó là vô tình, bởi vì các trình biên dịch hỗ trợ cho các mẫu bị hạn chế. Chương trình không có khả năng di động và tôi nghĩ rằng nó chỉ hoạt động trên một trình biên dịch
BЈовић
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.