Opened 17 years ago
Last modified 8 years ago
#547 closed Feature Requests (fixed)
[variant] Compile time checked getter — at Initial Version
Reported by: | nobody | Owned by: | nobody |
---|---|---|---|
Milestone: | Boost 1.58.0 | Component: | variant |
Version: | None | Severity: | Optimization |
Keywords: | Cc: |
Description
[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)
Note:
See TracTickets
for help on using tickets.