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