C++ 11 không có vòng lặp dựa trên phạm vi cho chuỗi tích phân tầm xa.vòng lặp dựa trên dải C++ 11 cho phạm vi (L, R)
for(auto e : {0..10}) // wouldn't compile!!!
Vì vậy, tôi vừa quyết định mô phỏng nó.
template< class T , bool enable = std::is_integral<T>::value >
struct range_impl
{
struct iterator
{
constexpr T operator *()const noexcept { return value; }
iterator& operator ++()noexcept { ++value; return *this; }
friend
constexpr bool operator != (const iterator & lhs, const iterator rhs) noexcept
{
return lhs.value != rhs.value;
}
T value;
};
constexpr iterator begin()const noexcept { return { first }; }
constexpr iterator end ()const noexcept { return { last }; }
T first;
T last ;
};
template< class T >
range_impl<T> range(T first , T last) noexcept
{
return {first, last};
}
int main(){
// print numbers in [ 0..10), i.e. 0 1 2 3 4 5 6 7 8 9
for(auto e : range(0,10)) std::cout << e << ' ';
std::cout << std::endl;
}
Hỏi: Cách tổng quát phương pháp này cho bộ chuyển tiếp?
dụ:
template< class ForwardIterator, class T >
bool find(ForwardIterator first, ForwardIterator last, T const& value)
{
for(auto e: range(first, last)) if (e == v) return true;
return false;
}
Đó không phải là thực sự * khái quát * nó; số nguyên không phải là vòng lặp. Về cơ bản bạn đang tạo một hàm mới có cùng tên. –