【问题标题】:Range based for loop through non-const literal c++通过非常量文字c ++的基于范围的循环
【发布时间】:2021-05-04 00:12:02
【问题描述】:

编译器上下文:我正在使用 GDB v8.3 Ubuntu 和选项 g++ -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,2,3};
vector<int> b {4,5,6};

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

【问题讨论】:

  • v 应该是连接向量中的每个 vector 还是每个 int
  • 明确地说,您希望它等同于func(a); func(b);?

标签: c++ for-loop c++11 casting constants


【解决方案1】:

根据您的 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

【讨论】:

    【解决方案2】:
    int x,y;
    for(int& i:{std::ref(x),std::ref(y)}){
        i=7;
    }
    

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

    另一个技巧是:

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

    你可以写:

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

    或pre- 更多字符的版本,然后:

    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&amp;&amp; 参数;使用其他一些声明它不起作用)。

    auto 函数的参数是 的东西。

    然后,... 是逗号折叠执行, 的东西。

    auto lambda 的参数是 的东西。

    所有都可以替换为 构造(在这种情况下),但代价是更加冗长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      相关资源
      最近更新 更多