On Thu, Oct 11, 2012 at 1:23 PM, Lawrence Crowl <[email protected]> wrote:
> On 10/10/12, Xinliang David Li <[email protected]> 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