访问boost::variant &&std::variant

std::visit

定义于头文件 <variant>

   

template <class Visitor, class... Variants>
constexpr /*see below*/ visit(Visitor&& vis, Variants&&... vars);

  (C++17 起)
     

将观览器 vis 应用到 variant 变量组 vars

等效于返回

std::invoke(std::forward<Visitor>(vis), std::get<is>(std::forward<Variants>(vars))...)

,其中 is...vars.index()... 。如同用 decltype 从返回的表达式推导返回类型。

若上述调用不是对于所有 variant 的所有可选项类型均为同一类型和值类别的合法表达式,则调用为病式。

参数

vis - 一个接受每个 variant 的每个可能可选项的可调用 (Callable) 对象
vars - 传递给观览器的 variant 列表

返回值

观览器的所选调用所返回的值,转换成所有可行的 std::invoke 表达式的共用类型。

异常

若任何 vars 中的 variant 为因异常无值( valueless_by_exception ),则抛出 std::bad_variant_access

复杂度

variant 的数量为零或一时,可调用对象的调用在常数时间内实现,即它不依赖 sizeof...(Types)

variant 的数量大于1,则可调用对象的调用没有复杂度要求。

 

函数 apply_visitor

boost::apply_visitor —

将给定的访问者应用到给定的 variant 的内容上,该过程在编译期进行类型安全检查,以确认所有类型均被访问者所处理。

摘要

template<typename Visitor, typename Variant> 
  typename Visitor::result_type 
  apply_visitor(Visitor & visitor, Variant & operand);
template<typename Visitor, typename Variant> 
  typename Visitor::result_type 
  apply_visitor(const Visitor & visitor, Variant & operand);
template<typename BinaryVisitor, typename Variant1, typename Variant2> 
  typename BinaryVisitor::result_type 
  apply_visitor(BinaryVisitor & visitor, Variant1 & operand1, 
                Variant2 & operand2);
template<typename BinaryVisitor, typename Variant1, typename Variant2> 
  typename BinaryVisitor::result_type 
  apply_visitor(const BinaryVisitor & visitor, Variant1 & operand1, 
                Variant2 & operand2);
template<typename Visitor> 
  apply_visitor_delayed_t<Visitor> apply_visitor(Visitor & visitor);

说明

apply_visitor 的行为取决于它所操作的参数的数量(即除访问者以外的其它参数)。该函数的行为如下:

  • 接受一个操作数的重载将以给定的 variant 操作数的内容调用给定的访问者的单参函数调用操作符。
  • 接受两个操作数的重载将以给定的 variant 操作数的内容调用给定的访问者的二元函数调用操作符。
  • 只接受一个访问者的重载将返回一个 泛型函数对象,该对象接受一个或两个参数并以这些参数和 visitor 调用 apply_visitor, 其行为和前面两项相似。(这种行为特别有用,例如当你需要对一个 variant 对象序列中的各个元素使用一个标准库算法时)。

返回: 接受操作数的重载将返回将给定访问者应用于给定操作数所得的结果。只接受一个访问者的重载则返回一个函数对象,以延后将访问者应用于任意操作数。 要求: 给定的访问者必须符合 StaticVisitor 概念的要求,并处理给定 variant 的各个有界类型。 抛出: 接受操作数的重载只会在给定的访问者抛出异常时抛出。只接受一个访问者的重载则不会抛出。(但是请注意,返回的 函数对象 有可能在运行时抛出)

猜你喜欢

转载自blog.csdn.net/Max_Cong/article/details/81195596