C++ 可变模板与函数对象

C++ 可变模板与函数对象,c++,variadic-templates,variadic-functions,C++,Variadic Templates,Variadic Functions,假设我们有两个函数对象,它们接受int并返回布尔值: struct EvenNumber { bool operator()(int const num) const { return num % 2 == 0; } } struct GreaterThenFive { bool operator()(int const num) const { return num > 5; } } 现在让我们假设我们有一个函数,它接受一个向量和一个可变的滤波器模板。函

假设我们有两个函数对象,它们接受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;
}
不能只调用参数上的每个过滤器,还需要对所有过滤器的结果进行析取

if ((std::forward<Filters>(filters)(num) && ...)) {
                                      // ^^  ALL conditions must be satisfied
if((std::forward(filters)(num)和&&…){
//^^必须满足所有条件
另外,
forward
的参数必须是类型
Filters
,而不是值
Filters

这里有一个。

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

if ((std::forward<Filters>(filters)(num) && ...)) {
                                      // ^^  ALL conditions must be satisfied
if((std::forward(filters)(num)和&&…){
//^^必须满足所有条件
另外,
forward
的参数必须是类型
Filters
,而不是值
Filters


这是一个。

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