2011-09-28 18 views
8

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?

cevap

8

ADL'nin çalışmalarına izin veririm. std ad alanında uzmanlık eklemenize izin verilirken, ad alanınızdaki düz bir serbest işlev yeterli olduğunda, bunun için düşünebilmem için güçlü bir neden yoktur. döngüler için bir aralığı için, özellikle

, standart durumları:

§6.5.4/1 (tanımı başlar-expr ve son İfade):

  • aksi halde, başlangıç-expr ve son-expr sırasıyla begin(__range) ve end(__range), başlangıç ​​ve bitiş argüman-bağımlı arama (3.4.2) ile bakılır. Bu ad aramasının amacı için, namespace std ilişkili bir ad alanıdır.
4

Tamamen sorun yok ve ADL'ye "güven" önerilir. begin ve end işlevleri, türünüzün arabiriminin bir parçasıdır (bağımsız işlevler olup olmadığına bakılmaksızın) ve türünüzle aynı ad alanında olmalıdır.

İlgili konular