变分模板和函数对象



假设我们有两个函数对象,它们接受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;
}

但这并不适用于意外的令牌。。。;预期(。这里需要fold表达式吗?如果我们想对原始向量的所有数字执行所有过滤操作,语法应该是什么样子?

调用代码可以如下所示:

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

这是一个演示。

相关内容

  • 没有找到相关文章

最新更新