这是出于好奇而不是必要的问题。我发现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的巧妙想法印象深刻,所以我想问一下。
答案 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;