簡體   English   中英

使用基於范圍的 for 循環遍歷指針列表

[英]using a range-based for-loop to iterate through a list of pointers

今天是個好日子,

我一直在嘗試使用以下代碼將列表中的所有指針重置為 nullptr,如下所示:

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

問題是指針的副本被復制到 item,所以原始的 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
}

我想得到某種參考

您正在使用該帶括號的初始化列表創建一個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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM