On Friday, 22 December 2017 at 22:09:05 UTC, H. S. Teoh wrote:
On Fri, Dec 22, 2017 at 09:13:31PM +0000, kerdemdemir via
Digitalmars-d-learn wrote:
I want to make a logging function for member variables by
using reflection.
[...]
class B
{
void Log()
{
auto a = [__traits(derivedMembers, D)];
foreach(memberName; a) {
// Somehow write only member variables with their
names
// Result should be : a = 4.0, b = 3.0
Try this:
import std.traits : FieldNameTuple;
foreach (memberName; FieldNameTuple!B) {
writefln("%s = %s", memberName, mixin("this." ~ memberName));
}
T
and then turn it into a LoggerMixin with a mixin template and
re-use it any time you want.
import std.stdio : writeln, writefln;
import std.traits : FieldNameTuple;
mixin template LoggerMixin() {
void Log() {
foreach (memberName; FieldNameTuple!(typeof(this))) {
writefln("%s = %s", memberName, mixin("this." ~
memberName));
}
}
}
struct S {
int x;
bool y;
double z;
mixin LoggerMixin;
}
void main() {
S s1 = S(int.min, true, 6666);
S s2 = S(int.max, false, 6666);
s1.Log();
s2.Log();
}