Tôi có một hàm cần liệt kê một trình lặp nhiều lần, nhưng according to MSDN, "Khi bạn tăng bất kỳ bản sao nào của trình lặp đầu vào, không một bản sao nào khác có thể được so sánh, dereferenced hoặc tăng lên một cách an toàn sau đó."Làm thế nào để hạn chế một trình lặp trở thành một trình chuyển tiếp tiến trình?
Vì vậy, để dễ dàng hơn, thay vì tạo một triển khai riêng biệt cho các trình chuyển tiếp không sao chép dữ liệu và liệt kê bản sao, tôi muốn hạn chế phương pháp của mình để chỉ thực hiện chuyển tiếp. .
Ngay bây giờ tôi có một cái gì đó như:
template<typename It, typename TCallback /*signature: bool(value_type)*/>
bool EnumerateTwice(const It &begin, const It &end, TCallback callback)
{
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
return true;
}
nhưng không hạn chế It
để trở thành một iterator về phía trước.
Làm cách nào để đặt hạn chế đó vào chức năng được tạo khuôn mẫu? (C++ 03)
+1 Oooooo không biết trình lặp được gắn thẻ! Đó là khá tiện dụng. Cảm ơn rất nhiều! :) – Mehrdad
Điều này sẽ từ chối các trình vòng lặp truy cập hai chiều và truy cập ngẫu nhiên. Sử dụng 'is_base_of' thay vì' is_same' cho ngữ nghĩa phù hợp. – ildjarn
@ildjarn: Ồ đúng rồi, điểm tốt; cảm ơn! – Mehrdad