C++11 基于范围的循环参考

C++11 基于范围的循环参考,c++11,C++11,这个问题是出于好奇,而不是出于必要。我发现C++11基于范围的for循环非常有用的一种方法是迭代离散对象: #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 <<

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

#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';
    }
我想到了两种解决方法,但这些方法似乎会产生一些小的额外成本,而且看起来并不干净:

    // meh:
    for (int* n : {&a, &b, &c}) {
        *n = 0;
    }

    // meh:
    using intRef = std::reference_wrapper<int>;
    for (int& n : {intRef (a), intRef (b), intRef (c)}) {
        n = 0;
    }
}
//meh:
对于(int*n:{&a,&b,&c}){
*n=0;
}
//meh:
使用intRef=std::reference\u包装器;
for(int&n:{intRef(a)、intRef(b)、intRef(c)}){
n=0;
}
}

所以问题是,有没有更干净或更好的方法?这个问题可能没有答案,但人们关于stackoverflow的聪明想法总是让我印象深刻,所以我想我会问。

你可以使用
std::ref
,而不是自己构建一个
reference\u包装,这是你能得到的:

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

根据@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)...};
}

您的代码真的只是将值设置为0吗?您可以使用
std::ref
。这差不多是你能做到的了。@SombreroChicken是的,这是一个进步,谢谢@如果你把它写进一个答案,我会接受的,这是一个进步
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;