2016-04-06 30 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]; }); 
}