|
Boost : |
From: Joe Gottman (jgottman_at_[hidden])
Date: 2006-01-11 20:26:39
"SourceForge.net" <noreply_at_[hidden]> wrote in message
news:E1EwZvr-0000WY-Ka_at_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
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk