2016-03-25 9 views
4

Я понимаю, что boost::variant реализуется нечто вроде такКак оператор << с буст :: вариант реализуется

template <typename... Vs> 
struct variant { 
    std::aligned_union<Vs...>::type buffer; 
    .... 
}; 

Как мы можем сделать operator<< для структуры, как это, что печатает слепков тип хранящийся в буфер и передает это значение operator<< для cout? Для этого нам нужно будет знать тип элемента, сохраненного в буфере, вправо? Есть ли способ узнать это?

Также я ищу объяснение такой реализации, если таковая существует. Не только, что он существует, и как я могу его использовать.

ответ

5

Boost имеет функцию apply_visitor, которая принимает общий объект функции и передает в нее тип варианта. Таким образом, внедрение operator<< так же просто, как:

template <class... Ts> 
std::ostream& operator<<(std::ostream& os, boost::variant<Ts...> const& var) { 
    return boost::apply_visitor(ostream_visitor{os}, var); 
} 

с:

struct ostream_visitor : boost::static_visitor<std::ostream&> 
{ 
    std::ostream& os; 

    template <class T> 
    std::ostream& operator()(T const& val) { 
     return os << val; 
    } 
}; 

Или просто:

template <class... Ts> 
std::ostream& operator<<(std::ostream& os, boost::variant<Ts...> const& var) { 
    return boost::apply_visitor([&os](const auto& val) -> std::ostream& { 
     return os << val; 
    }, var); 
} 

Вы можете видеть некоторые другие примеры в tutorial.

+0

Спасибо за ваш ответ! Не могли бы вы объяснить это немного больше, пожалуйста. Я не совсем понял, что происходит ... Как «ostream_visitor» знает, что это за тип варианта? Функция 'T' в функции, похоже, просто разрешает тип' boost :: variant '. – Curious

+0

@ Curious Нет, это определенно нет. Прочтите учебник, все это довольно хорошо объяснено там. – Barry

+0

Спасибо. Я поддержал ваш ответ. Я прочитаю его. Но в функторе вы просто проходите в варианте типа правильно? Как повысить уровень знаний о том, какой тип объекта находится в переменной? Я хотел больше рассказать о том, как повысилось это повышение. – Curious

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

  • Нет связанных вопросов^_^