2013-07-17 10 views
3

어제 제가이 질문을했고 "juanchopanza"가 내 질문에 대답했지만 불행히도 제한된 유형 중 하나를 발견하지 못했습니다. "방문자"를 사용하는 것이 더욱 강력하기 때문에 누구나 "방문자"를 사용하여 해결책을 줄 수 있을지 궁금합니다. 나는이 벡터를 호출 할 때변형의 벡터에서 apply_visitor를 사용하여

boost::variant<T1*, T2, T3> Var; 
std::vector<Var> Vec; 

만 T2 경계 유형을 필터링하는 가장 좋은 방법은 무엇입니까 : 나는 다음과 같이 정의 된 부스트 변형의 벡터를 필터링하는 가장 좋은 방법을 찾고 있어요

새 벡터에 삽입 하시겠습니까? 또는 다른 방법으로,이

std::vector<T2> T2Vec = (apply_visitor를 사용하여 VEC에서 필터링하는 방법) ...

감사 같은 것을 다시 싶어!

편집 : @ 영원히으로 sulotion :

template<typename T> 
struct T_visitor : public boost::static_visitor<> 
{ 
    T_visitor(std::vector<T>& v) : vec(v) {} 
    template<typename U> 
    void operator() (const U&) {} 
    void operator() (const T& value) 
    { 
     vec.push_back(value); 
    } 
private: 
    std::vector<T>& vec; 
}; 

과 :

std::vector<T1> t1vec; 
    T_visitor<T1> vis(t1vec); 
    std::for_each(vec.begin(), vec.end(), boost::apply_visitor(vis)); 

여기에 문제가 있는지 말해 주시겠습니까?

+0

'T_visitor vis (t1vec);'여기 템플릿 인수가 없습니다. –

+0

@juanchopanza이 방문자는 어떻게 새 메시지를 메모리에있는 개체의 주소가 포함되어 있거나 포인터의 벡터가 이러한 개체를 가리 키도록 변경할 수 있습니까? –

+1

'std :: vector '다음에'vec.push_back (& ​​value)'을 사용할 수는 있지만주의 할 점은 벡터 재배치가 벡터 요소에 대한 포인터 또는 반복자를 유효하지 않게 만들 수 있다는 것입니다. – juanchopanza

답변

7
struct T2_visitor : public boost::static_visitor<> 
{ 
    T2_visitor(std::vector<T2>& v) : vec(v) {} 
    template<typename T> 
    void operator() (const T&) {} 
    void operator() (const T2& value) 
    { 
     vec.push_back(value); 
    } 
private: 
    std::vector<T2>& vec; 
}; 

std::vector<T2> T2Vec; 
T2_visitor vis(T2Vec); 
std::for_each(Vec.begin(), Vec.end(), boost::apply_visitor(vis)); 
+0

덕분에 @ ForEveR, 모든 경계 유형 (T1 *, T2 및 T3)이 "T2_visitor"에 적용될 수 있도록 확장 할 수 있습니까? 다른 말로하면 T_visitor로 만들까요? –

+0

@ H'h 왜 안 되니? 모든 유형에 대한 연산자를 오버로드하고 3 개의 벡터를 사용하거나 방문자를 템플릿으로 만들 수 있습니다. http://ideone.com/JjeorN 도움을 줄 수 있습니다. – ForEveR

+0

@ ForEver, 적용한 다음 오류가 발생했습니다. /home/m.cc : 1027 : 13 : 오류 : 'vis'이전에 템플릿 인수가 누락되었습니다. /home/m.cc:1027:13 : 오류 : 'vis'이전에 예상 됨 'vis' /home/m.cc:1028:68 : 오류 : 'vis'는이 범위에서 선언되지 않았습니다 –