2016-04-06 29 views
2

我在寫第一個可變參數函數模板。我收到錯誤error: parameter packs not expanded with ‘...’:。可能我在這裏無法理解一些簡單的概念。我想將所有通過iterators存入vector。什麼是正確的方法來做到這一點?檢查等長度的STL容器的變量函數

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; 
    } 
} 

這失敗(下GCC 4.8.4在Ubuntu)編譯:

../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 ‘...’: 

回答

4

你在這個語句中使用兩種不同的包裝:

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

its擴大,但Iterator不是一種類型......它也是一個包裝,並且您無法擴展它。因此錯誤(具體指出Iterator)。

如果你想要的是容器的大小,你可以只呼籲所有傳入的集裝箱(集裝箱,沒有迭代器!)size()也放到了一個數組(不需要動態分配):

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]; }); 
}