Boost logo

Boost :

From: Zara (yozara_at_[hidden])
Date: 2005-12-28 05:59:01


Dear all,

During a redesign, I began using boost::variant, and I detected that
trying to get a value of a type not included in variant type-list
resulted in run-time error (cast or null pointer).

I feel that a variant should only try to return a valid type from its
type-list, otherwise giving a compiler error, and reserve runttime
errors for that case when someone tries to get a value from a type
contained in the typelist, but not the actual type contained in the
actual object.

In such a way, I have made a little redesign on boost::get and called
it boost::checked_get:

namespace boost {

template <typename U, BOOST_VARIANT_ENUM_PARAMS(typename T) >
inline
    typename add_pointer<U>::type
checked_get(
      boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >* operand
      BOOST_VARIANT_AUX_GET_EXPLICIT_TEMPLATE_TYPE(U)
    )
{
    typedef boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) > Variant;

    /* throw a compile-time error if type is not contained on type
list */
    BOOST_STATIC_ASSERT((!is_same<
        typename mpl::find<typename Variant::types,U>::type,
        typename mpl::end<typename Variant::types>::type>::value));

    typedef typename add_pointer<U>::type U_ptr;
    if (!operand) return static_cast<U_ptr>(0);

    detail::variant::get_visitor<U> v;
    return operand->apply_visitor(v);
}

} // end of addition to namespace boost

And, of course, the rest of the templates needed for const *, ref and
const&..

I think it would be interesting to include it in boost libraries. In
fact, I use it intensely.

Best regards,

-- Zara

PS Forgive me for my bad english.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk