Boost logo

Boost :

From: SourceForge.net (noreply_at_[hidden])
Date: 2006-01-11 01:58:07


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.

Best regards,

Zara (yozara_at_[hidden])

----------------------------------------------------------------------

You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=357586&aid=1402546&group_id=7586

-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems? Stop! Download the new AJAX search engine that makes
searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
Boost-bugs mailing list
Boost-bugs_at_[hidden]
https://lists.sourceforge.net/lists/listinfo/boost-bugs


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