Son görüşmelerinden birinde, Herb Sutter, container.begin()
üzerinden ücretsiz begin(container)
end(container)
işlev şablonlarını kullanmayı önerir. Bunu beğendim, çünkü bu işlev begin()/end() yöntemleriyle gelmeyen tüm yinelenebilir türler için sağlanabilir. Etki alanı sınıflarımın çoğunun alan dilinde konuştuğu ve başlangıç / bitiş gibi genel adlar kullanmadığı için, artık ana sınıf arabirimi bozmadan döngüleri için STL kapsayıcılarına ve aralık tabanına uyumlu yinelenebilir bir arabirim sağlayabiliyorum. Kendi türleri için başlangıç / bitiş işlevlerini sağlamanın en iyi yolunun ne olduğunu merak ediyorum. İlk düşüncem, swap
ile aynı şekilde yapmak ve işlevi türümün yaşadığı aynı ad alanında yazmaktı.Kendi türünüz için serbest başlangıç / bitiş işlevleri nasıl sağlanır
namespace My
{
class Book
{
public:
typedef std::vector<Page>::const_iterator PageIterator;
PageIterator FirstPage() const { return begin(pages_); }
PageIterator LastPage() const { return end(pages_); }
private:
std::vector<Page> pages_;
};
Book::PageIterator begin(const Book& b)
{
return b.FirstPage();
}
Book::PageIterator end(const Book& b)
{
return b.LastPage();
}
}
Burada ADL'ye güvenmek doğru mu, yoksa std ad alanında mı olmalı? Başka bir şekilde std ad alanında bir uzmanlık sağlamak olduğunu düşünüyorum (std'de aşırı yüklenmeye izin verilmiyor, değil mi?). Döngüleri temel alan aramayı bulmak için en iyi yol hangisidir?