【问题标题】:Variadic templates and function objects可变参数模板和函数对象
【发布时间】:2021-04-23 20:40:28
【问题描述】:

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

【问题讨论】:

  • 是的,显然我们需要一个折叠表达式。

标签: c++ variadic-templates variadic-functions


【解决方案1】:

您不能只调用参数上的每个过滤器,您还需要对所有过滤器的结果进行析取。

if ((std::forward<Filters>(filters)(num) && ...)) {
                                      // ^^  ALL conditions must be satisfied

另外,forward 的参数必须是类型 Filters,而不是值 filters

这是demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2019-04-30
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多