2016-04-06 20 views
2

İlk variadic işlev şablonumu yazıyorum. error: parameter packs not expanded with ‘...’: hatasını alıyorum. Muhtemelen burada bazı kolay kavramları anlayamıyorum. iterators’da vector numaralı iletiyi saklamak istiyorum. Bunu yapmanın doğru yolu nedir? genişletilirSTL kaplarının eşit uzunluklarını kontrol etmek için Variadic işlevi

std::vector<Iterator> vec_its {its...}; 

its:

../proc.h: In function ‘bool IsEqualLength(Iterator& ...)’: 
../proc.h:32:24: error: parameter packs not expanded with ‘...’: 
    std::vector<Iterator> vec_its {its...}; 
         ^
../proc.h:32:24: note:   ‘Iterator’ 
../proc.h:35:87: error: parameter packs not expanded with ‘...’: 

cevap

4

Bu açıklamada iki farklı paketleri kullanıyoruz:

template<typename... Iterator> 
bool IsEqualLength(Iterator&... its) 
{ 
    std::vector<Iterator> vec_its {its...}; 
    int head = vec_its.front().size(); 

    bool is_diff_size = std::any_of(vec_its.begin(), vec_its.end(), 
     [&head](Iterator& cur){return cur.size() != head;}); 

    if(is_diff_size) 
    { 
     return false; 
    } else { 
     return true; 
    } 
} 

Bu (gcc 4.8.4 altında Ubuntu üzerine) ile derlenmeyecektir ama Iterator tek bir tip değil ... aynı zamanda bir paket ve bunu genişletmek için başarısız oluyorsunuz. Bu nedenle hata (özellikle Iterator'u işaret eder).

istediğiniz tüm konteynerlerin büyüklükleri ise, sadece tüm geçirilen içinde konteynerler (konteynerler değil, yineleyiciler!) Üzerine size() arayıp bir diziye (dinamik ayırmaya gerek) o bırakabilir:

template <typename... Container> 
bool isEqualLength(Container&&... cs) { 
    size_t sizes[] = {cs.size()...}; 

    return std::all_of(std::begin(sizes), std::end(sizes), 
     [&sizes](size_t cur){return cur == sizes[0]; }); 
} 
İlgili konular