用于检查 STL 容器长度相等的可变参数函数
Variadic function to check equal lengths of STL containers
我正在编写我的第一个可变函数模板。我收到错误 error: parameter packs not expanded with ‘...’:
。可能我在这里无法理解一些简单的概念。我想将 iterators
中传递的所有内容存储在 vector
中。正确的做法是什么?
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;
}
}
编译失败(在 Ubuntu 上的 gcc 4.8.4 下):
../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 ‘...’:
您在此声明中使用了两个不同的包:
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]; });
}
我正在编写我的第一个可变函数模板。我收到错误 error: parameter packs not expanded with ‘...’:
。可能我在这里无法理解一些简单的概念。我想将 iterators
中传递的所有内容存储在 vector
中。正确的做法是什么?
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;
}
}
编译失败(在 Ubuntu 上的 gcc 4.8.4 下):
../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 ‘...’:
您在此声明中使用了两个不同的包:
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]; });
}