std::visit
定义于头文件 |
||
template <class Visitor, class... Variants> |
(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
的各个有界类型。 抛出: 接受操作数的重载只会在给定的访问者抛出异常时抛出。只接受一个访问者的重载则不会抛出。(但是请注意,返回的 函数对象 有可能在运行时抛出)