On 01/21/2016 03:37 PM, Darrell Gallion wrote:
How do you create a template that accepts many types.
But overrides just one of them?
Don't want to write out all of the specializations.

Hours of google and I'm sure it's simple...

-=Darrell

The straightforward approach is tricky because the ': int' syntax means "is implicitly convertible"; so, even the case where B is 'char' would be bound to the specialization:

void foo(A, B, C)() {
    pragma(msg, "general");
}

void foo(A, B : int, C)() {  // <-- 'B : int' specialization
    pragma(msg, "special");
}

void main() {
    foo!(char, string, double)();
    foo!(short, int, float)();
}

A better approach is using template constraints:

void foo(A, B, C)()
        if (!is (B == int)) {  // <-- 'B != int'
    pragma(msg, "general");
}

void foo(A, B, C)()
        if (is (B == int)) { // <-- 'B == int'
    pragma(msg, "special");
}

void main() {
    foo!(char, string, double)();
    foo!(short, int, float)();
}

But that has its own problem of needing to reverse the logic for the general case (and other cases), which may become very complicated to write (or to get right) in some cases.

Ali

Reply via email to