|
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