2016-12-21 14 views
9

tôi có một đối tượng với các chức năng để nhận được bắt đầu và kết thúc vòng lặp:Làm cách nào để tạo dải ô từ trình lặp đầu tiên và kết thúc?

const_iterator err_begin() const 
const_iterator err_end() const 

Bởi vì họ đang không có tên beginend, tôi không thể vượt qua đối tượng của tôi trực tiếp đến chức năng trong phạm vi-v3.

Có một trình bao bọc đơn giản mà tôi có thể sử dụng để làm cho đối tượng này hoạt động với thư viện phạm vi-v3 không?

Ví dụ:

auto hasErrors = !empty(something(x.err_begin(), x.err_end())); 
+0

Thêm 'begin()' và 'end()' gọi hai hàm này, tương ứng? –

+0

Đối tượng là một phần của thư viện. Tôi không thể thay đổi tên phương thức hoặc thêm phương thức mới. – sdgfsdh

+0

Tạo trình bao bọc đơn giản mà bạn đang nói về việc ánh xạ các cuộc gọi bắt đầu và kết thúc đến những cái bạn muốn. – mascoj

Trả lời

9

Âm thanh như bạn đang tìm kiếm iterator_range:

auto hasErrors = !empty(ranges::make_iterator_range(x.err_begin(), x.err_end())); 
+4

Tài liệu về cuộc sống 'iterator_range' [ở đây] (https://ericniebler.github.io/range-v3/structranges_1_1v3_1_1iterator__range.html). Chỉ cần gọi 'range :: make_iterator_range (x.err_begin(), x.err_end())'. –

+0

Tôi không thể tìm thấy 'iterator_range' và' make_iterator_range' từ mã nữa. Họ đã được đổi tên chưa? – kaba

4

Bạn làm rõ rằng lớp trong câu hỏi là một phần của một thư viện mà bạn không thể thay đổi. Khỏe. Tạo lớp mặt tiền:

class FacadeClass { 

     const RealClassWithErrBeginEnd &r; 

public: 

     FacadeClass(const RealClassWithErrBeginEnd &r) : r(r) {} 

     auto begin() const { return r.err_begin(); } 
     auto end() const { return r.err_end(); } 
}; 

Điều này sẽ đủ tốt để đánh lừa hầu hết mã mong đợi vùng chứa. Trong trường hợp xấu nhất, bạn có thể cần phải cung cấp typedefs bổ sung trong mặt tiền, ví dụ: value_type, vv ...

+0

Loại này không phải là [Regular] (http://stackoverflow.com/a/14000046/195873). Nó sẽ không chơi độc đáo với phần còn lại của thư viện range-v3. Câu trả lời của Brian dưới đây là câu trả lời đúng. (Tôi là tác giả của phạm vi-v3, FWIW.) –

0

boost::make_iterator_range sẽ làm điều đúng. Bây giờ thêm một chút ADL và chúng tôi thấy rằng một chức năng miễn phí giải quyết tất cả các vấn đề của chúng tôi:

#include <vector> 
#include <iostream> 
#include <string> 
#include <boost/range.hpp> 


// simulate the library class 
struct X 
{ 
    auto err_begin() const { return errors.begin(); } 
    auto err_end() const { return errors.end(); } 

    std::vector<std::string> errors; 

}; 

// provide a generator to build an iterator range 
auto errors(const X& x) 
{ 
    return boost::make_iterator_range(x.err_begin(), x.err_end()); 
} 

// do things with the iterator_range 
int main() 
{ 
    X x; 
    for (const auto& err : errors(x)) 
    { 
     std::cout << err << std::endl; 
    } 

    std::cout << empty(errors(x)) << std::endl; 
} 
Các vấn đề liên quan