HDK
|
Go to the source code of this file.
Namespaces | |
Vt_ValueVisitDetail | |
Macros | |
#define | VT_CASE_FOR_TYPE_INDEX(unused, elem) |
Functions | |
template<class T , class Visitor , class = decltype(std::declval<Visitor>()(std::declval<T>()))> | |
auto | Vt_ValueVisitDetail::Visit (VtValue const &val, Visitor &&visitor, int) |
template<class T , class Visitor > | |
auto | Vt_ValueVisitDetail::Visit (VtValue const &val, Visitor &&visitor,...) |
template<class Visitor > | |
auto | VtVisitValue (VtValue const &value, Visitor &&visitor) |
#define VT_CASE_FOR_TYPE_INDEX | ( | unused, | |
elem | |||
) |
auto VtVisitValue | ( | VtValue const & | value, |
Visitor && | visitor | ||
) |
Invoke visitor
with value's
held object if value
holds an object of one of the "known" value types (those in VT_VALUE_TYPES, see vt/types.h). If value
does not hold a known type, or if it is empty, or if visitor
cannot be called with an object of the held type, then call visitor
with value
itself. Note this means that visitor
must be callable with a VtValue argument.
VtVisitValue() can be lower overhead compared to a chained-if of VtValue::IsHolding() calls, or a hash-table-lookup dispatch. Additionally, visitors can handle related types with a single case, rather than calling out all types individually. For example:
Note that the visitor is invoked as a normal C++ call expression, so implicit conversions and standard overload resolution (including controlling overload resolution via techniques like enable_if) can take place. For example, consider the following, where the double-specific overload is invoked for VtValues holding double, float, and GfHalf.
Definition at line 105 of file visitValue.h.