簡體   English   中英

用原子數組初始化類或結構

[英]initializing a class or struct with an atomic array

如何用原子變量數組編寫用戶定義的類/結構的復制構造函數? 例如,以下代碼無法編譯

struct foo
{    
     std::array<std::atomic_int,3> a;
     foo() = default;
     foo(const int& i, const int& j, const int& k):a{{i,j,k}}{}
}

因為“錯誤:在這里聲明__atomic_base(const __atomic_base&)= delete;” 即在原子類型的定義中將其刪除。 如果不是非原子的,那將會完成。

有什么辦法可以做到這一點?

我已經在這里進行了討論C ++-如何初始化原子數組?

由於無法將原子值從一個對象復制到另一個對象,因此刪除了std::atomic復制構造函數:

std::atomic<int> a, b;
a = b; //  use of deleted function 'std::atomic<int>& std::atomic<int>::operator=(const std::atomic<int>&)'

但是,您可以從一個原子中讀取值,然后將讀取的內容存儲到另一個原子中,您只需要一些不舒服的語法即可明確表示您不希望獲得原子副本:

std::atomic<int> a, b;
a = b.load();

您可以使用for循環以這種方式復制原子數組:

std::array<std::atomic<int>, 3> a, b;
for (const auto& i : b) {
  a = i.load();
}

或-為避免顯式循環-轉換:

std::array<std::atomic<int>, 3> a, b;
std::transform(begin(b), end(b), begin(a),
               [](int i){return i;});

所以我將您的復制構造函數實現為:

foo(const foo& other) {
    std::transform(begin(other.a), end(other.a), begin(a),
                   [](int i){return i;});
}

只需手動定義復制構造函數,然后在構造函數的主體中逐個元素復制數組元素(如果應該復制)。 請注意,這不是原子的。

暫無
暫無

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

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