我有一个模板化函数,它可以获取选项或向量。我希望能够对所有元素进行 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
?为什么这部分不是本着泛型编程精神的标准库?
答案 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`.
}