2017-11-19 23 views
1

목록의 일종으로 함수 매개 변수를 저장하는 것이 가능하며 나는내가 기본 클래스</p> <pre><code>template<class T> class Base { public: Base(T foo = T()) { for(int i = 0; i < 10; i++) foos.push_back(foo); } private: std::vector<T> foos; } </code></pre> <p>에게이

나는이 뭘 원하는
class Derived : public Base<Bar> 
{ 
public: 
    Derived() : Base(Bar("somerandomparameter")) {} 
} 

이 만드는 것입니다 파생 클래스를 가지고 제공된 컨스트럭터를 가진 10 개의 새로운 바의 벡터 (그것이 무엇이든간에).

사용자 정의 복사본 생성자를 만들려고했지만 push_back 메서드가 더 많은 복사본을 만드는 것처럼 보이기 때문에 예상대로 작동하지 않았습니다. 적어도 Bar 생성자는 10 번 이상 호출되었습니다.

나에게 가장 적합한 솔루션은 원하는 매개 변수를 10 개만 생성하기 때문에 매개 변수 목록을 전달하는 것과 같습니다.

... 
Base(ParameterList l) 
{ 
    for(int i = 0; i < 10; i++) 
     foos.push_back(T(l)); 
} 
... 

그러나 이후

내가 어떤 유형 또는 필요 T 매개 변수의 수에 적응 될 그 목록이 필요 템플릿 클래스입니다. 그 일을하는 방법이 있습니까 아니면 내가하고 싶은 일을하는 더 나은 방법을 알고 있습니까?

+1

C++ 11은 [가변 템플릿] (http://en.cppreference.com/w/cpp/language/parameter_pack)을 허용합니다. 당신은 표준 C++ –

답변

4

템플릿 클래스는 템플릿으로 생성 된 생성자를 더 가질 수 있습니다. 귀하의 경우 매개 변수 팩을 수락하고 (완전하지 않은) 전달을 필요로하는 것이 필요합니다.

template<class T> 
class Base 
{ 
    std::vector<T> foos; 

public: 
    template<typename... Args> 
    Base(Args&&... args) 
    { 
     foos.reserve(10); 
     for(int i = 0; i < 10; i++) 
      foos.emplace_back(args...); 
    } 
}; 

그리고 그렇게해야합니다. Derived 클래스의 생성자에있는 Base<Bar>의 생성자에 매개 변수를 전달하기 만하면됩니다.

내가 완전하지 않은 전달을 강조하는 이유는 삽입 된 첫 번째 항목에 인수가 std::forward이면 해당 항목이 이동되어 두 번째 항목이 유효하지 않게됩니다. YMMV, 당신은 이것을 신중하게 고려해야합니다.

+0

를 지정할 수 있습니다. 와우, 정말 고마워요! 그것은 매력처럼 작동합니다! 마지막 단락을 저처럼 초보자에게 설명해 주시겠습니까? ;) 나는 포워딩이 무엇인지 알지 못한다. (단지 l과 rvalues와 관련이있다) – po0l

+0

@ po0l - 예약 호출은 시작부터 10 개의 요소를위한 공간이되도록한다. 그렇게하면 삽입 할 때 vector가 enything을 재 할당 할 필요가 없습니다. 마지막 단락은 [완벽한 전달의 의미] (https://stackoverflow.com/questions/3582001/advantages-of-using-forward)를 다룹니다. 나는 그것이 너무 많은 논평에서 브로치에 주제가 두렵다. 또한 귀하의 즉각적인 질문과 관련이 없습니다. – StoryTeller

+0

어쨌든 고마워요. 당신 말이 맞아요. 제 문제는 즉시 필요한 것은 아니지만, 제가 이해하지 못하는 것을 이해하고 싶습니다.). 나는 인터넷에서 볼 것이다! – po0l