2013-10-11 15 views
9

Tiêu đề <algorithm> cung cấp std::equal_range(), cũng như một số vùng chứa có chức năng thành viên. Điều làm phiền tôi với hàm này là nó trả về một cặp các trình vòng lặp, làm cho nó tẻ nhạt để lặp lại từ trình vòng lặp bắt đầu đến trình vòng lặp kết thúc. Tôi muốn có thể sử dụng std::begin()std::end() để tôi có thể sử dụng vòng lặp C++ 11 cho vòng lặp.Tôi có thể chuyên std :: bắt đầu và std :: kết thúc cho giá trị trả về của equal_range()?

Bây giờ, tôi đã nghe thông tin mâu thuẫn liên quan đến chuyên std::begin()std::end() - Tôi được thông báo rằng việc thêm bất kỳ thứ gì vào không gian tên std dẫn đến hành vi không xác định, trong khi tôi cũng được thông báo rằng bạn có thể cung cấp chuyên môn của riêng mình của std::begin()std::end().

Đây là những gì tôi đang làm ngay bây giờ:

namespace std 
{ 
    template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category> 
    Iter begin(pair<Iter, Iter> const &p) 
    { 
     return p.first; 
    } 
    template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category> 
    Iter end(pair<Iter, Iter> const &p) 
    { 
     return p.second; 
    } 
} 

Và điều này không làm việc: http://ideone.com/wHVfkh

Nhưng tôi tự hỏi, những nhược điểm để làm điều này là gì? Có cách nào tốt hơn để làm điều này?

Trả lời

7

17.6.4.2.1/1 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 để không gian tên std hoặc một không gian tên trong namespace std trừ trường hợp quy định. Một 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 chỉ khi khai báo phụ thuộc vào loại do người dùng xác định và chuyên môn đáp ứng các yêu cầu của thư viện chuẩn cho mẫu và không bị cấm rõ ràng.

Vì vậy, tôi tin rằng, về mặt kỹ thuật, mã của bạn thể hiện hành vi không xác định. Có lẽ bạn có thể viết một lớp đơn giản mà có một cặp vòng lặp trong hàm tạo của nó và thực hiện các phương thức begin()end(). Sau đó, bạn có thể viết một cái gì đó như

for (const auto& elem: as_range(equal_range(...))) {} 
+0

Chính xác như thế nào là 'một phần' là được cho phép nếu các loại do người dùng xác định có liên quan? Cặp chứa các trình vòng lặp lặp qua một vùng chứa unique_ptrs đến kiểu do người dùng định nghĩa của tôi. –

+0

Định nghĩa của bạn, như được viết, không đề cập đến bất kỳ loại do người dùng xác định nào. Các mẫu này cuối cùng có thể được khởi tạo với các loại do người dùng xác định, nhưng điều đó không liên quan. –

+1

Trong mọi trường hợp, lối thoát "phụ thuộc vào loại do người dùng xác định" chỉ áp dụng cho các chuyên môn mẫu. Bản thân bạn không phải là: chúng là các mẫu chức năng chính, chỉ xảy ra khi quá tải các mẫu chức năng khác có cùng tên. –

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