Người dùng được phép thêm chuyên môn rõ ràng vào không gian tên std
. Tuy nhiên, có một vài mẫu mà tôi bị cấm một cách rõ ràng từ chuyên.Điều gì có thể và tôi không thể chuyên về không gian tên std?
Tôi có thể chuyên môn hóa những mẫu nào?
Người dùng được phép thêm chuyên môn rõ ràng vào không gian tên std
. Tuy nhiên, có một vài mẫu mà tôi bị cấm một cách rõ ràng từ chuyên.Điều gì có thể và tôi không thể chuyên về không gian tên std?
Tôi có thể chuyên môn hóa những mẫu nào?
Trích dẫn lỏng lẻo từ tiêu chuẩn:
numeric_limits
sẽ không được chuyên cho loại tiêu chuẩn phi số học (ví dụ complex<T>
)
"[S] pecializations của shared_ptr
sẽ CopyConstructible, CopyAssignable, và LessThanComparable [và] có thể chuyển đổi thành bool
. "
"Chuyên môn của weak_ptr
phải là CopyConstructible và CopyAssignable".
"[T] các chuyên ngành emplate [của std::hash
] phải đáp ứng các yêu cầu của băm mẫu lớp".
Mọi thứ trong <type_traits>
: "Hành vi của chương trình thêm chuyên môn cho bất kỳ mẫu lớp nào được xác định trong điều này là không xác định trừ khi được chỉ định khác". (chỉ một số chuyên môn của common_type
được cho phép một cách rõ ràng)
Các khu vực có một số chuyên môn nhất định là yêu cầu.
Tất cả các chuyên môn của istreambuf_iterator
sẽ có một hàm tạo bản sao nhỏ, một hàm tạo mặc định constexpr và một hàm hủy nhỏ.
"Hiệu ứng của việc khởi tạo mẫu lớp complex
đối với bất kỳ loại nào khác ngoài float, double hoặc long double không được chỉ định." Tôi lấy nó có nghĩa là việc xác định các chuyên ngành khác là vô nghĩa.
"Chuyên môn và instantiations của mẫu atomic
phải có một bản sao đã xóa, một toán tử gán bản sao đã xóa và một hàm tạo giá trị constexpr."
"Mẫu lớp unary_function
và binary_function
không còn được dùng nữa. Chương trình sẽ không khai báo chuyên môn của các mẫu này".
Và dĩ nhiên mệnh đề bao quát 17.6.4.2.1, câu 1 (nhờ @sehe và @curiousguy):
Hành vi của một chương trình C++ là undefined nếu nó thêm tuyên bố hoặc định nghĩa đến không gian tên std hoặc đến một không gian tên trong không gian tên trừ khi được chỉ định khác. Chương trình có thể thêm chuyên môn mẫu cho bất kỳ mẫu thư viện chuẩn nào vào không gian tên chỉ khi khai báo phụ thuộc vào kiểu người dùng được xác định và chuyên môn đáp ứng yêu cầu thư viện chuẩn cho mẫu ban đầu và không rõ ràng là .
Và câu 2:
Hành vi của một chương trình C++ là undefined nếu nó tuyên bố
một chuyên môn hóa rõ ràng của bất kỳ hàm thành viên của một lớp mẫu thư viện chuẩn, hoặc
một chuyên môn rõ ràng về bất kỳ mẫu chức năng thành viên nào của lớp thư viện chuẩn hoặc mẫu lớp học hoặc
một chuyên môn rõ ràng hoặc một phần của bất kỳ mẫu lớp thành viên nào của lớp thư viện chuẩn hoặc mẫu lớp học.
Một chương trình có thể nhanh chóng một cách rõ ràng mẫu quy định tại các thư viện chuẩn chỉ khi khai phụ thuộc vào tên của một loại người dùng định nghĩa và instantiation đáp ứng các yêu cầu về tiêu chuẩn thư viện cho mẫu gốc.
Tôi mong đợi các chuyên môn của 'shared_ptr',' weak_ptr' sẽ nhiều hơn CopySomething! – curiousguy
"Chương trình có thể thêm chuyên môn mẫu cho bất kỳ mẫu thư viện chuẩn nào vào không gian tên' std' only (...) chuyên môn ** đáp ứng các yêu cầu thư viện chuẩn cho mẫu gốc ** " – curiousguy
Chính xác, bạn đang tìm kiếm câu trả lời? Thực sự, nếu bạn muốn chuyên gì đó, bạn phải tham khảo thông số kỹ thuật. Hầu hết các thành phần Thư viện chuẩn áp đặt các yêu cầu về chuyên môn. Một câu trả lời hoàn chỉnh về những gì bạn có thể và không thể chuyên môn và những hạn chế về chuyên môn sẽ là quá dài đối với một câu trả lời Stack Overflow. –
Bởi "chuyên chức năng", tôi giả sử bạn có nghĩa là "chuyên mẫu chức năng"? Nhân tiện, C++ 11 có cho phép chuyên môn hóa một phần chức năng không? – fredoverflow
không được phép chuyên môn hoá một phần mẫu chức năng, thay vào đó hãy sử dụng chức năng nạp chồng chức năng. xem http://www.gotw.ca/publications/mill17.htm – mark