Хм, а почему boost::apply_visitor может зависать во время выполнения проги?
template<typename Visitor, typename Variant>
typename Visitor::result_type
apply_visitor(const Visitor & visitor, Variant & operand);
Вообще странно, что он принимает lvalue reference?
Есть какое-то отличие от std::visit у него на уровне использования?