| Home | Libraries | People | FAQ | More

## Function polymorphic_relaxed_get

boost::polymorphic_relaxed_get — Retrieves a value of a specified type from a given `variant`.Unlike polymorphic_strict_get does not assert at compile time that type `U` is one of the types that can be stored in variant.

## Synopsis

    // In header: <boost/variant/polymorphic_get.hpp>

    template<typename U, typename T1, typename T2, ..., typename TN>
      U * polymorphic_relaxed_get(variant<T1, T2, ..., TN> * operand);
    template<typename U, typename T1, typename T2, ..., typename TN>
      const U * polymorphic_relaxed_get(const variant<T1, T2, ..., TN> * operand);
    template<typename U, typename T1, typename T2, ..., typename TN>
      U & polymorphic_relaxed_get(variant<T1, T2, ..., TN> & operand);
    template<typename U, typename T1, typename T2, ..., typename TN>
      const U & polymorphic_relaxed_get(const variant<T1, T2, ..., TN> & operand);

## Description

The `polymorphic_get` function allows run-time checked, type-safe retrieval of the content of the given `variant`. The function succeeds only if the content is of the specified type `U` or of type derived from type `U`, with failure indicated as described below.

Recomendation: Use `polymorphic_get` or `polymorphic_strict_get` in new code. `polymorphic_strict_get` provides more compile time checks and it's behavior is closer to `std::get` from C++ Standard Library.

Warning: After either `operand` or its content is destroyed (e.g., when the given `variant` is assigned a value of different type), the returned reference is invalidated. Thus, significant care and caution must be extended when handling the returned reference.

Notes: | As part of its guarantee of type-safety, `polymorphic_get` enforces `const`-correctness. Thus, the specified type `U` must be `const`-qualified whenever `operand` or its content is likewise `const`-qualified. The converse, however, is not required: that is, the specified type `U` may be `const`-qualified even when `operand` and its content are not.
Returns: | If passed a pointer, `polymorphic_get` returns a pointer to the value content if it is of the specified type `U` or of type derived from type `U`; otherwise, a null pointer is returned. If passed a reference, `polymorphic_get` returns a reference to the value content if it is of the specified type `U` or of type derived from type `U`; otherwise, an exception is thrown (see below).
Throws: | Overloads taking a `variant` pointer will not throw; the overloads taking a `variant` reference throw `bad_polymorphic_get` if the content is not of the specified type `U`or of type derived from type `U`.
Rationale: | While visitation via `apply_visitor` is generally preferred due to its greater safety, `polymorphic_get` may may be more convenient in some cases due to its straightforward usage.