2013-07-17 1 views
3

Вчера я задал этот вопрос, и «juanchopanza» ответил на мой вопрос, но, к сожалению, я не смог поймать один из ограниченных типов. Поскольку использование «посетителя» более надежное, мне также интересно, кто-нибудь может дать мне решение, используя «посетителя»?using apply_visitor для фильтрации из вектора варианта

Я ищу наилучший способ фильтрации вектора варианта наддува, который был определен, как это:

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

, когда я называю этот вектор, то, что является лучшим способом для фильтрации только T2 ограниченного типа и вставить в новый вектор? или по-другому, я хочу что-то вроде этого

std::vector<T2> T2Vec = ... (как отфильтровать его от Vec использованием apply_visitor) ...

еще раз спасибо!

EDIT: 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: error: expected ';' before 'vis' /home/m.cc:1028:68: error: 'vis' не был объявлен в этой области –

Смежные вопросы