On 8/26/21 10:06 AM, Adam D Ruppe wrote:
On Thursday, 26 August 2021 at 17:01:06 UTC, DLearner wrote:
The object was to take a variable, and do alternative things with it depending on (say) whether it was an 'int' or an 'int*'.

That's *very* easy to do with the alias. You can just check `typeof(v)` in there.

String mixins are appealing because they can inject code like C macros do. It's not trivially possible to do the same with template mixins.

import std.traits : isPointer;
import std.stdio : writeln;

mixin template valueFrom(alias var)
if (isPointer!(typeof(var))) {
  writeln("Dereferencing a pointer");  // ERROR
  x = *var;
}

mixin template valueFrom(alias var)
if (!isPointer!(typeof(var))) {
  writeln("Using a scalar");           // ERROR
  x = var;
}

void main() {
  int x;
  int i = 42;
  mixin valueFrom!i;

  int * p = &i;
  mixin valueFrom!p;
}

Yes, there are tricks one can play or change the design but when it comes to "injecting code", template mixins are not as convenient as string mixins.

Ali

Reply via email to