[Boost-bugs] [ boost-Feature Requests-1402546 ] [variant] Compile time checked getter

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@terra.es) ---------------------------------------------------------------------- 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@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/boost-bugs

"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
participants (2)
-
Joe Gottman
-
SourceForge.net