
"SourceForge.net" <noreply@sourceforge.net> wrote in message news:E1EwZvr-0000WY-Ka@sc8-sf-web2.sourceforge.net...
Feature Requests item #1402546, was opened at 2006-01-10 22:58 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=357586&aid=1402546&group_id=7586
Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: [variant] Compile time checked getter
Initial Comment: [Sorry if anyone feels bad about this, I already posted it in usera and devel lists, with no answer at 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.
I don't know enough about Variants to comment on the implementation, but I think this is a very good idea. If it possible to identify a mistake at compile-time rather than run-time I always prefer to be notified at compile-time. Joe Gottman