Khi viết các chức năng chung cho "lặp" dao động tôi thường làm:suy ra loại mẫu gõ vào C++
template <typename Iter> auto func(Iter &first, Iter &last)
{
using IterType = typename std::decay<decltype(*first)>::type;
...
}
Một cách khác có vẻ là:
template <typename Iter> auto func(Iter &first, Iter &last)
{
using IterType = typename std::iterator_traits<Iter>::value_type;
...
}
Chưa hết một phần ba:
template <typename Iter> auto func(Iter &first, Iter &last)
{
using IterType = typename Iter::value_type;
...
}
Không áp dụng iterator_traits
.
Về lý thuyết, chức năng của tôi chỉ nhận được trình lặp như first
và last
và dạng thứ hai lý tưởng nhất (imho) là cách thành ngữ nhất để nhận loại. Nhưng đang sử dụng typename std::decay<decltype(*first)>::type
thành ngữ chung nhất để không áp đặt các hạn chế đối với Iter
như đã định nghĩa value_type
?
Tôi nghĩ rằng đó là thành ngữ để chuyển các trình vòng lặp theo giá trị. – Lingxi
Nếu 'iterator_traits' không hoạt động đối với một cái gì đó, nói điều gì đó không phải là một trình lặp. –