使用基于范围的for循环来遍历指针列表



大家好,

我一直在尝试以下代码将列表中的所有指针重置为nullptr,如下所示:

for (auto item : { ptr1, ptr2, ptr3 })
item = nullptr;

问题是,指针的副本是指向项的,因此原始ptr在末尾不等于nullptr。

我想获得对指针本身的某种引用,或者可能已经有了一个更好的选择,可以将容器中的所有指针设置为nullptr。如果你们中的任何人碰巧与Qt合作,也许在Qt中有一个很好的方法可以做到这一点?提前感谢!

如果要键入各个指针变量,为什么不使用链式赋值呢?

ptr1 = ptr2 = ptr3 = nullptr;  // All three pointers are nullptr.

演示。


[…]或者可能已经有一个更好的替代方案可以将容器中的所有指针设置为nullptr

如果与单独的、命名的指针变量相比,您的指针位于实际容器中,则可以使用基于范围的for循环来写入和读取容器的指针元素:

#include <array>
#include <ios>
#include <iostream>
// Container of 'pointer-to-const-int' elements.
using MyPointersArray = std::array<int const*, 3>;
void inspectNullptrness(const MyPointersArray& arr) {
for (const auto& p : arr) {
std::cout << std::boolalpha 
<< (p == nullptr) << " ";
}
}
int main() {
MyPointersArray pointers{nullptr, nullptr, nullptr};
const int a = 42;
inspectNullptrness(pointers); // true true true

// Set pointers.
for(auto& p : pointers) { p = &a; }
inspectNullptrness(pointers); // false false false

// Reset pointers.
for(auto& p : pointers) { p = nullptr; }
inspectNullptrness(pointers); // true true true
}

我想获得某种引用

您正在创建一个带有支撑init列表的std::initializer_list。不幸的是,这样的列表总是包含副本,您无法通过该列表将其分配给用于初始化的变量。

你可以使用参考包装:

for (auto ref : { std::ref(ptr1), std::ref(ptr2), std::ref(ptr3) })
ref.get() = nullptr;

如果使用指针数组而不是单独的变量,那么对它们进行迭代将是微不足道的:

T* ptrs[3];
for (auto& ptr : ptrs})
ptr = nullptr;

最新更新