One more simple idea for simplifying constraints
deadalnix via Digitalmars-d
digitalmars-d at puremagic.com
Mon Apr 25 20:20:22 PDT 2016
On Tuesday, 26 April 2016 at 03:17:09 UTC, Stefan Koch wrote:
> On Monday, 25 April 2016 at 18:50:28 UTC, Andrei Alexandrescu
> wrote:
>> Sometimes we use constraints to distinguish different approach
>> to implementation, e.g. find for a string is different than
>> find for forward ranges is different from find for input
>> ranges etc.
>>
>> One simple idea here (which Walter also advised a while ago)
>> is to push implementation details inside the, well,
>> implementation, e.g.:
>>
>> Type functionName(TemplateArgs)(Args)
>> if (HighLevelConstraint)
>> {
>> static if (LowLevelCapability1)
>> {
>> .. specialization 1 ...
>> }
>> else static if (LowLevelCapability1)
>> {
>> ... specialization 2 ...
>> }
>> else
>> {
>> .. conservative impl ...
>> }
>> }
>>
>> That way the user/documentation only deals with the high level
>> constraint (the minimum necessary for the function to work).
>> Inside, the function decides the exact approach.
>>
>> It's an obvious idea now but many times in the past I didn't
>> pursue it.
>>
>>
>> Andrei
>
> While working on implementing template constraints for SDC.
> I had a similar idea, basically a template constraint can be
> rewritten as a static if inside the template.
>
>
> R Tmpl (U) (U u) if (is(U == int)) { pragma(msg, "U is an
> int"); }
> R Tmpl (U) (U u) if (is(U == string)) { pragma(msg, "U is a
> string"); }
>
> is equivalent to
>
> R Templ (U u) {
> static if (is(U == int)) {
> pragma(msg, "U is an int");
> } else static if (is(U == string)) {
> pragma(msg, "U is a string");
> } else
> static assert(0, "Can only be instantiated with int or
> string");
> }
>
> Except that you just get one error message instead of 2
> overloads displayed.
It is not semantically equivalent.
More information about the Digitalmars-d
mailing list