微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于范围的循环通过非常量文字 c++

如何解决基于范围的循环通过非常量文字 c++

编译器上下文:我正在使用带有选项 GDB v8.3 Ubuntug++ -Im -O2 -std=c++0x 进行编译。

我经常需要为两个或三个对象完成一些循环,因此我使用将表达式包装在基于范围的 for 循环中,并使用包含的文字

python3 中,这看起来像:

a = [1,2,3]
b = [4,5,6]

for v in (a,b):
    func(v)

在 C++ 中,这显然不是那么简单。据我所知,使用 {a,b} 会创建某种类型的初始化列表,因此转换无法正常工作。在我的尝试中,我遇到了这种情况,但不明白我如何正确通过引用传递并使其可变,因为我的编译器抱怨这必然是 const。

vector<int> a {1,3};
vector<int> b {4,6};

for(auto& v: {a,b}) // error non-const
    func(v);

解决方法

根据您的 Python 程序,您似乎想遍历所有向量,但对每个向量都有一个可变引用。你可以通过使用指针来做到这一点:

for(auto *v: {&a,&b})  // iterate over pointers to the vectors
    func(*v);           // dereference the pointers to get mutable
                        // references to the vectors 

这是一个 demo

,
int x,y;
for(int& i:{std::ref(x),std::ref(y)}){
    i=7;
}

auto& 不起作用,您必须为每个元素重复 std::ref

另一个技巧是:

auto action=[&](auto&foo){
  // code
};
action(v1);
action(v2);

你可以写:

void foreach_arg(auto&&f,auto&&...args){
  ((void)f(decltype(args)(args)),...);
}

或更多字符的 之前的版本,然后:

auto action=[&](auto&foo){
  // code
};
foreach_arg(action,v1,v2);

如果你想要首先提到的参数,你可以这样做:

auto foreacher(auto&&...args){
  return [&](auto&&f){
    ((void)f(decltype(args)(args)),...);
  };
}

并得到:

foreacher(v1,v2)([&](auto&v){
  // loop body
});

对于任何错别字深表歉意。只是编写失眠代码,尚未测试。

decltype 在这种情况下是一个短的 std::forward 等价物(使用 auto&& 参数;使用其他一些声明它不起作用)。

auto 函数的参数是 的东西。

然后,... 是逗号折叠执行, 事情。

auto lambda 的参数是 的事情。

所有都可以替换为 结构(在本例中),但代价是更加冗长。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。