[variant] Compile time checked getter
— at Version 7
[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)
Change History
(7)
Component: |
None → variant
|
Owner: |
changed from nobody to ebf
|
Severity: |
→ Showstopper
|
Status: |
assigned → new
|
Severity: |
Showstopper → Optimization
|
Description: |
modified (diff)
|
Milestone: |
→ Boost 1.58.0
|
Owner: |
changed from ebf to Antony Polukhin
|
Status: |
assigned → new
|