On Wed, Sep 19, 2012 at 4:17 AM, Richard Guenther <richard.guent...@gmail.com> wrote: > On Wed, Sep 19, 2012 at 9:29 AM, Eric Botcazou <ebotca...@adacore.com> wrote: >>> >>> The language syntax would bind the conditional into the intializer, as in >>> >>> if (varpool_node *vnode = (node->try_variable () >>> && vnode->finalized)) >>> varpool_analyze_node (vnode); >>> >>> which does not type-match. >>> >>> So, if you want the type saftey and performance, the cascade is really >>> unavoidable. >> >> Just write: >> >> varpool_node *vnode; >> >> if ((vnode = node->try_variable ()) && vnode->finalized) >> varpool_analyze_node (vnode); >> >> This has been the standard style for the past 2 decades and trading it for >> cascading if's is really a bad idea. > > Indeed. Btw, can we not provide a specialization for dynamic_cast <>?
No, it is a language primitive. but we can define out own operation with similar syntax that allows for specialization, whose generic implementation uses dynamic_cast. template<typename T, typename U> T* is(U* u) { return dynamic_cast<T*>(u); } > This ->try_... looks awkward to me compared to the more familiar > > vnode = dynamic_cast <varpool_node> (node) > > but yeah - dynamic_cast is not a template ... (but maybe there is some > standard library piece that mimics it?). > > Richard. > >> -- >> Eric Botcazou