Eric Friedman wrote: > > In the past we sought to support the following... > > variant<...> var; > T* p = extract<T>(&var); > T& r = extract<T>(var); > > ...but it had to be dropped because (essentially) ambiguity exists > between the following: > > template <typename T, typename Extractable> > T& extract(Extractable & operand); > template <typename T, typename Extractable> > T* extract(Extractable * const operand);
This is only ambiguous in its most general form given above. If you rewrite it as template <class T, ...> T & extract(variant<...> & operand); template <class T, ...> T const & extract(variant<...> const & operand); template <class T, ...> T * extract(variant<...> * operand); template <class T, ...> T const * extract(variant<...> const * operand); it's no longer ambiguous. The other option is to support a dynamic_cast-style extract: T * p = extract<T*>(&var); T & r = extract<T&>(var); but it would likely require partial ordering/specialization. "extract" is probably not the best name in both cases since it doesn't extract, it returns a reference to the internal representation. The documentation needs to describe when this reference is invalidated. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost