2014-01-15 9 views
1

클래스/구조체의 사용자 정의 복사 생성자를 원자 변수의 배열로 작성하는 방법은 무엇입니까? 예를 들어, 다음 코드는 그 이유클래스 또는 구조체를 원자 배열로 초기화하는 방법

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) = 삭제;" 즉 이것은 원자 적 유형의 정의에서 삭제됩니다. 그것이 비 원자 적 이었다면 그것은 행해졌을 것이다.

이렇게하는 방법이 있습니까?

나는 여기서 토론을 마쳤다 C++ - How to initialise an array of atomics?.

+1

참고 :'foo는 (CONST의 INT & I, CONST의 INT & j, const int & k)'는 복사 생성자 *가 아닙니다. 만약 당신이 그 생성자를 작성하고 싶다면 * foo (const int & i, const int & j, const int & k) : a {{{i}, {j}, {k }}} {}'이것은 집계 멤버의 복사 초기화를 호출하는 집계 초기화와 관련이 있습니다. – dyp

+0

안녕하세요 @dyp, 지적 해 주셔서 고맙습니다. 문제는 이제 foo (const int & i, const int & j, const int & k) {a [0] .store (int (i)); a [1]. 저장소 (int (j)); a [2]. 저장소 (int (k));}. 감사! – BapiC

답변

0

복사 생성자를 수동으로 정의하고 배열 요소를 생성자 본문의 요소별로 복사합니다 (복사해야하는 경우). 이것이 원자 적이지 않다는 것을 명심하십시오.

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

당신은, 그러나, 하나의 원자에서 값을 읽고 다음 무엇을 저장할 수 있습니다 : 원자 하나의 개체에서 다른 값을 복사 할 수있는 방법이 없기 때문에

+0

안녕하세요 @ SebastianRedl, 나는 그것을 시도하고 그것은주의로 이미 언급 한 이유로 정확하게 작동하지 않습니다. 내 목적은이 클래스에 대한 생성자를 작성하는 것입니다. 그렇지만 ** a **가 배열이 아니더라도 작동하지 않습니다. – BapiC

1

std::atomic 복사 생성자는 삭제됩니다 당신은 for 루프와 아토의 배열이 방법을 복사 할 수 있습니다

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

: 다른로 읽어, 당신은 당신이 원자 사본을 기대하지 않는 것이 명시 적 있는지 확인하는 약간의 불편 구문을 필요

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;}); 
} 
+0

@dyp 일반적인 경우에 대한 좋은 생각이지만, '변환'을위한 람다를 약간 이상하게 만든다. 나는'std :: transform (begin (b), end (b), begin (a), [] (decltype (* b.cbegin()) i) {return i.load 코드가 내가 작성한 코드의 복사본 생성자에서'[] (decltype (other.a [0]) i) {return i.load();}를 사용할 수는 있지만 generity가 절대적으로 중요하지 않는 한, . 물론 [OPTIONS]에는 C++ 14 컴파일러가 없다고 가정합니다.) – Casey

+0

@dyp tsk, tsk - 복사! [] (const auto & foo) {return foo.load()}' 미안해, 너를 밟았다. – Casey

+0

: D ok ... 잠시 혼란에 빠졌습니다 – dyp