On 3/3/2014 5:35 PM, Chris wrote:

Maybe I'm a bit too philosophical about this. But consider the following
(made up) case:

struct MyTemp(T) {
     // ...
     T add(T a, T b) {
         if (a is string && b is string) {
               return a~b;  // or return a~"+"~b; or whatever
         } else if (a is integer && a is integer) {
               return a+b;
         }
     }
}

I don't know if this can be considered a "pure" template. It is a
template of sorts, but the type specialization in the function add makes
it a watered-down template,

Any useful template function already works that way. The mere + operator is *not* one single operation, but a whole category of opcodes which are chosen based on the operand's type. Thus, + can be thought of as a built-in template that [roughly] does this:

T opPlus(T a, T b) {
    if (T is integer) {
        [asm opcode for 32-bit addition] a, b
    } else if (T is ubyte) {
        [asm opcode for 8-bit addition] a, b
    } else if (T is float) {
        [asm opcode for floating point addition] a, b
    }
}

Specialization is what makes function templates useful. Some of the specialization is explicit (static if) and some is implicit (+ operator). But without specialization (explicit or implicit), all instantiations would be identical. If all instantiations are identical, why even have a template in the first place?

Reply via email to