2013-07-07 4 views
1
class Bar 
{ 
Bar(var1 v1, var2 v2) 
    { 
    // setup Bar fields 
    } 
// bar fields 
}  

class Foo 
{ 
Foo() 
    : 
    mArray();// how to do this part 
    { 

    } 
std::array<Bar, 800> mArray; 
} 

바는 일부 매개 변수를 사용하는 ctor를 사용하여이 배열을 구성해야합니다. 나중에 모두 올바른 값을 할당하기 때문에 모두 동일한 값으로 생성되면 ok입니다. 초기화되었습니다. 나는 이걸 봤어 여러 구문을 시도했지만 옳은 일을 얻을 수없는 몇 가지 이유.std :: array의 구문은 필드로 무엇이며 내부의 객체는 매개 변수를 취하는 ctor로 작성해야합니다?

+0

이것은 컴파일 타임에 필요한 객체의 수를 알고 있기 때문에 고정 배열 크기입니다. – EddieV223

+0

이니셜 라이저 목록을 사용하는 것은 아마도 (나 자신을 아직 사용하지 않았으므로) 수행 할 것입니다. [SO link] (http://stackoverflow.com/questions/6893700/how-to-construct-stdarray-object-with- initializer-list) – Tony

답변

1

Bar에는 기본 생성자가 없으므로 std::array<Bar>에는 기본 생성자가 없습니다. 당신이 Bar에 기본 생성자를 추가하는 경우

, std::array<Bar>도 하나가됩니다

#include <array> 
using namespace std; 

typedef int var1, var2; 

class Bar 
{ 
public: 
Bar() {} // <--------- HERE 

Bar(var1 v1, var2 v2) 
    { 
    // setup Bar fields 
    } 
// bar fields 
};  

class Foo 
{ 
Foo() 
    : 
    mArray() 
    { 

    } 
std::array<Bar, 3> mArray; 
}; 
+0

이니셜 라이저 목록에 800 개의 막대를 작성해야합니까? – EddieV223

+0

Bar에 기본 (빈 매개 변수) 식별자가없는 경우 컴파일되지 않습니다 – EddieV223

+0

@ EddieV223 : Bar에 기본 생성자가 없습니다. 그것이 문제이다. –

3
template<unsigned...>struct seq {}; 
template<unsigned max, unsigned... s>struct make_seq:make_seq<max-1,max-1,s...>{}; 
template<unsigned...s>struct make_seq<0,s...>:seq<s...>{}; 

을 위의 우리가 시간 순서를 컴파일 할 수 있습니다.

다음으로 array에 800 요소를 생성하는 데 사용할 수 있습니다. (전화로) 오타를 포함하고 make_bar을 작성해야하지만, 나중에 800 개 바의 배열을 생성 할 수 있습니다

template<unsigned N> Bar make_bar(); 
template<unsigned N,unsigned...s> 
std::array<Bar,N> make_array_helper(seq<s...>){ 
    return { make_bar<s>()... }; 
} 
template<unsigned N> 
std::array<Bar,N> make_array(){ 
    return make_array_helper(make_seq<N>()); 
} 

.... 그 핵심은 800 요소 패러미터 팩을 만들고 나서 그것을 압축하여 800 요소 생성자를 생성하는 것입니다.

대체로 기본 제공자를 Bar에 추가하십시오.

Bar을 하나만 사용하고 800 개로 복사하는 것은 어렵지 않습니다. Bar을 전달하여 새로운 요소를 만들면됩니다.

+0

실제로이 방법은 대부분의 컴파일러에서 재귀 템플릿 인스턴스화 제한을 초과하므로 작동하지 않습니다. 이런 식으로 정말로하고 싶다면 [여기에 표시] (http://stackoverflow.com/q/13072359/1131467)와 같이 로그 깊이 패턴을 사용해야합니다. –

+0

@ user1131467 800에서 C++ 11 (900)에 대한 권장 recusion 제한을 깨지 않습니다.그것이 충분히 작았 기 때문에 나는 그것을 간단하게 유지하기로 결정했다! – Yakk

+0

실제로 권장되는 제한은 1024가 아니라 1024이지만 gcc 기본값은 어떤 이유로 든 512입니다. clang 또는 msvc에 대해 전혀 몰라요. –