问题描述
假设我们有两个函数对象,它们接受一个 int 并返回一个布尔值:
struct Evennumber {
bool operator()(int const num) const {
return num % 2 == 0;
}
}
struct GreaterThenFive {
bool operator()(int const num) const {
return num > 5;
}
}
现在假设我们有一个函数,它接受一个向量和一个过滤器的可变参数模板。该函数应返回一个新向量,该向量仅包含原始向量中满足过滤操作的那些元素:
template <typename... Filters>
std::vector<int> filter_out(std::vector<int> const& vec,Filters&&... filters) {
std::vector<int> result;
for (int const num : vec) {
if (std::forward<filters>(filters)(num)...) {
result.push_back(num);
}
}
return result;
}
但这不适用于意外的令牌...;预期的 )。我们需要在这里折叠表达吗?如果我们想对原始向量的所有数字执行所有过滤操作,语法应该如何?
auto result = filter_out({1,2,3,4,5,6,7},Evennumber{},GreaterThenFive{});
解决方法
您不能只是调用参数上的每个过滤器,您还需要对所有过滤器的结果进行析取。
if ((std::forward<Filters>(filters)(num) && ...)) {
// ^^ ALL conditions must be satisfied
此外,forward
的参数必须是类型 Filters
,而不是值 filters
。
这是一个 demo。