On Thu, Oct 11, 2012 at 1:23 PM, Lawrence Crowl <cr...@googlers.com> wrote: > On 10/10/12, Xinliang David Li <davi...@google.com> wrote: >> In a different thread, I proposed the following alternative to 'try_xxx': >> >> template<typename T> T* symbol::cast_to(symbol* p) { >> if (p->is<T>()) >> return static_cast<T*>(p); >> return 0; >> } >> >> cast: >> >> template<typename T> T& symbol:as(symbol* p) { >> assert(p->is<T>()) >> return static_cast<T&>(*p); >> >> } > > My concern here was never the technical feasibility, nor the > desirability of having the facility for generic code, but the amount > of the amount of typing in non-generic contexts. That is > > if (cgraph_node *q = p->try_function ()) > > versus > > if (cgraph_node *q = p->cast_to <cgraph_node *> ()) > > I thought the latter would generate objections. Does anyone object > to the extra typing? > > If not, I can make that change.
Think about a more complex class hierarchy and interface consistency. I believe you don't want this: tree::try_decl () { .. } tree::try_ssa_name () { ..} tree::try_type() {...} tree::try_int_const () {..} tree::try_exp () { ...} .. Rather one (or two with the const_cast version). template <T> T *tree::cast_to () { if (kind_ == kind_traits<T>::value) return static_cast<T*> (this); return 0; } thanks, David > > -- > Lawrence Crowl