On Friday, 22 January 2016 at 00:08:56 UTC, Ali Çehreli wrote:
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

I must apologize for such a vague question. Frustration had me.


import std.stdio;

void foo(A)()
        if (!is (A == int)) {
    pragma(msg, "int");
}

void foo(A)()
        if (is (A == int[])) {
    pragma(msg, "int[]");
}

void main() {

  foo!(int)();
  foo!(int[])();
}

===========

source\app.d(15): Error: template app.foo cannot deduce function from argument types !(int)(), candidates are:
source\app.d(3):        app.foo(A)() if (!is(A == int))
source\app.d(8):        app.foo(A)() if (is(A == int[]))
source\app.d(16): Error: app.foo called with argument types () matches both:
source\app.d(3):     app.foo!(int[]).foo()
and:
source\app.d(8):     app.foo!(int[]).foo()

Reply via email to