[英]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.