Robert,
On Sun, Feb 19, 2012 at 5:48 PM, Robert Ramey <ramey@rrsd.com> wrote:
Ovanes Markarian wrote:
> On Fri, Feb 17, 2012 at 9:40 PM, Robert Ramey <ramey@rrsd.com> wrote:
>
> [...]
>
> Andre Alex... gave a talk at "Going Native" proposing
> a "static if" for this case. But I don't see the necessity for
> for this since I would assume that the compiler
> just optimises away the "dead" code. I've compiled
> the above and it seems to do what I want but
> still I wonder.
>
>
> Robert, I see Andrey's proposal aimed to replace the enable_if which
> is based on SFINAE and greatly simplify the metaprogramming
> machinery. The code you present if fine and it might be optimized
> away by the compiler, but it might produce compilation errors, since
> all runtime branches of if-statement must be compilable without
> errors. SFINAE aimes to work around it, like we can enable some
> special treatment if the provided code "would compile" without
> errors.Basically this example is the first slide in Andrei's talk. The purposewas to introduce a use case for the need for "static if". To my mindit failed in its purpose since a "normal if" already does that. It's evenworse - Andrei ruminated on the question as to what should be donewith the "dead" branch. i.e. should it be skipped entirely or actuallycompiled - he left that question open. It seemed to me that for thiscase, the whole question could be addressed by adding languageto the standard that a compiler should elminate code for whichit can be determined at compile time will never be run.[...]Robert, somehow I do not get your proposal. How do you consider an if-branch, which is not going to compile, i.e. compilation error. Do you propose, to ignore that branch and just state: "OK, if there is a compilation error, that must be eliminated without any errors to the end-user". I don't think this can work. Therefore there should be a special language construct, which states: "if there is a compilation error, than it is safe to be ignored during the compilation"[...]
> On the other hand using static if we might inspect the exposed type
> system of some type T. Let's say we would like to unify some
> different types using a traits class. Out traits class should expose
> value_type of the inspected type (say we have a boost::shared_ptr and
> std::vector as input). boost::shared_ptr contains a typedef of
> underlying type which is named element_type and std::vector names the
> underlying type value_type. Out traits type should homogenize these
> two types and provide a value_type member, which contains the
> underlying type of either shared_ptr or std::vector. It can be easily
> "calculated/specialized/inspected" with static if construct. How are
> you going to solve this problem with the runtime if without using
> enable_if , overloads and template specializations?Hmmm - a small code example might make this easier to understand[...]I am a little bit in hurry today, but will submit the example tomorrow.