基于范围的for循环引用

时间:2018-06-21 13:00:13

标签: c++11

这是出于好奇而不是必要的问题。我发现C ++ 11的基于循环的范围有用的一种方法是迭代离散对象:

{'key2': 456, 'key1': 123, 'fkey1': 321, 'fkey2': 432, 'fkey3': 543}

我也希望能够使用相同的循环样式来修改非const引用,但我认为标准不允许(请参见Why are arrays of references illegal?):

#include <iostream>
#include <functional>

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;

    // handy:
    for (const int& n : {a, b, c}) {
        std::cout << n << '\n';
    }

我想到了两种解决方法,但是这些解决方法似乎会产生一些小的额外成本,而且看起来并不干净:

    // would be handy but not allowed:
    // for (int& n : {a, b, c}) {
    //     n = 0;
    // }

问题是,有没有更清洁或更完善的方法?对此可能没有任何答案,但是我总是对人们对stackoverflow的巧妙想法印象深刻,所以我想问一下。

2 个答案:

答案 0 :(得分:2)

您可以使用reference_wrapper来代替自己构造std::ref,这是可以做到的:

using std::ref;
for (int& n : {ref(a), ref(b), ref(c)}) {
    n = 0;
}

答案 1 :(得分:1)

拾起@Sombrero Chicken的想法,这是一种打字少的方法:

template <class ...Args> constexpr auto ref(Args&&... args)
{
   using First = std::tuple_element_t<0, std::tuple<Args...>>;
   using WrappedFirst = std::reference_wrapper<std::remove_reference_t<First>>;
   constexpr auto n = sizeof...(Args);

   return std::array<WrappedFirst, n>{std::ref(args)...};
}

可以通过

使用
for (int& n : ref(a, b, c))
    n = 0;