基于范围的 for 循环对泛型编程的可选

时间:2021-04-27 00:11:02

标签: c++ templates c++17

我有一个模板化函数,它可以获取选项或向量。我希望能够对所有元素进行 for 循环(可选时,我意识到这将是一次迭代,但希望编译器会做正确的事情并优化循环)。这将防止一些带有模板特化的重复代码来处理选项。

template <typename Container>
void Operate( const Container& c){
  for(const auto& element : c){
    foo(element);
  }
}

int main(){
  std::optional<int> a = ...;
  std::vector<float> b = ...;
  ...
  Operate(a); // only executes `foo(element)` if `c` has_value().
  Operate(b); // executes `foo(element)` for each element in `c`.
}

如何使用 std::optional 实现 Container?为什么这部分不是本着泛型编程精神的标准库?

1 个答案:

答案 0 :(得分:1)

std::optional 不是满足 range-based for loop 要求的容器,如:

  • 它不是数组类型
  • 它没有 begin()end() 方法
  • 它没有 std::begin()std::end() 的特化。

因此,您只需重载 Operate() 本身以接收 std::optional 参数,例如:

template <typename Container>
void Operate( const Container& c){
  for(const auto& element : c){
    foo(element);
  }
}

template <typename T>
void Operate( const std::optional<T>& opt){
  if(opt.has_value()){
    foo(opt.value());
  }
}

int main(){
  std::optional<int> a = ...;
  std::vector<float> b = ...;
  ...
  Operate(a); // only executes `foo(opt.value())` if `opt` has_value().
  Operate(b); // executes `foo(element)` for each element in `c`.
}

Demo

相关问题