Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于范围的for循环,可选for泛型编程_C++_Templates_C++17 - Fatal编程技术网

C++ 基于范围的for循环,可选for泛型编程

C++ 基于范围的for循环,可选for泛型编程,c++,templates,c++17,C++,Templates,C++17,我有一个模板函数,可以得到可选的或向量。我希望能够在所有元素上都有一个for循环(可选时,我意识到这将是一次迭代,但希望编译器会做正确的事情并优化掉循环)。这将防止使用模板专门化来处理选项的重复代码 template <typename Container> void Operate( const Container& c){ for(const auto& element : c){ foo(element); } } int main(){

我有一个模板函数,可以得到可选的或向量。我希望能够在所有元素上都有一个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`.
}

模板
无效操作(const Container&c){
用于(常量自动和元素:c){
foo(元素);
}
}
int main(){
std::可选a=。。。;
向量b=。。。;
...
Operate(a);//仅在`c`具有_值()时执行`foo(element)`。
Operate(b);//为'c'中的每个元素执行'foo(element)'。
}

对于
容器
,如何使用
std::optional
?为什么标准库的这一部分不符合泛型编程的精神?

std::optional
不是满足a要求的容器,例如:

  • 它不是数组类型
  • 它没有
    begin()
    end()
    方法
  • 它没有std::begin()和std::end()的专门化
因此,您只需重载
Operate()
本身,即可接受
std::optional
参数,例如:

模板
无效操作(const Container&c){
用于(常量自动和元素:c){
foo(元素);
}
}
模板
无效操作(常量标准::可选和可选){
if(opt.has_value()){
foo(opt.value());
}
}
int main(){
std::可选a=。。。;
向量b=。。。;
...
Operate(a);//仅在'opt'具有_值()时执行'foo(opt.value())'。
Operate(b);//为'c'中的每个元素执行'foo(element)'。
}

我无法100%确定您在这里追求的是什么<代码>标准::可选不是容器。您是否有一个包含
std::optional
的容器,并且希望在选项为false时自动跳过它?这不是是否允许迭代
optional
,但这绝不是每个人都期望的功能,因此它没有包含在原始提案中也就不足为奇了。关于
optional
延迟它的加入已经引起了足够的骚动,更不用说另一个有点争议的特性了。@user4581301 optional是一个具有固定元素数的“容器”,0或1。您可以使用
std::optional
而不是
std::vector
,并且只在其中放入零或一个元素。@Galik,您可以,但它在API级别的类型是错误的(不仅您丢失了合适的名称和API,而且是什么阻止了代码错误地添加更多内容?),具有不同的性能特征(向量使用动态分配,而选项不使用),并且具有不同的编译时支持(在C++20之前,您根本不能使用向量,甚至在C++20中也不能,例如,
constepr vector v=foo();
)。你可以编写一个包装器,使可选的iteranable,但可能不是一个好主意。嗯,可以做每一个空的dereference…我希望&寻找一种方法来删除重复的代码,这需要。