On 01/21/2013 10:02 AM, mist wrote:
> Hm, but why can't static assert provide an instantiation trace? I can
> live without error message

I forgot to mention that template constraints take part in choosing the implementation as well:

void foo(string s)()
    if ((s == "hello") || (s == "goodbye"))
{
    // ...
}

void foo(string s)()
    if (s == "howdy")
{
    // ...
}

void main()
{
    foo!"howdy"();    // not an error: goes to special implementation
    foo!"merhaba"();  // error: no implementation at all
}

In order to achieve the same goal without template constraints we have two options:

1) Template specialization, which I don't think is not valid for non-type template parameters like string:

void foo(string s == "hello")() // ERROR; I don't think possible
{
    // ...
}

2) 'static if' in the implementation:

void foo(string s)()
{
    static if ((s == "hello") || (s == "goodbye")) {
        // ...

    } else static if (s == "howdy") {
        // ...

    } else {
        static assert(false, "Invalid string " ~ s);
    }
}

void main()
{
    foo!"howdy"();
    foo!"merhaba"();
}

You are right though, dmd does produce useful information for this simple case:

Error: static assert  "Invalid string merhaba"
       instantiated from here: foo!("merhaba")

The only shortcoming that I see in this case is that the implementations for different string values are inside the same function template.

> but duplicating same condition twice (one
> time being part of implementation) hurts my eyes :(

Can you elaborate. I don't see the duplication.

Ali

Reply via email to