On 6/19/15 12:09 PM, Quentin Ladeveze wrote:
On Friday, 19 June 2015 at 14:42:59 UTC, Steven Schveighoffer wrote:
On 6/19/15 10:13 AM, Quentin Ladeveze wrote:
On Friday, 19 June 2015 at 14:04:05 UTC, Daniel Kozák wrote:

On Fri, 19 Jun 2015 13:52:52 +0000
Quentin Ladeveze via Digitalmars-d-learn
<digitalmars-d-learn@puremagic.com> wrote:

On Friday, 19 June 2015 at 13:38:45 UTC, Steven Schveighoffer wrote:
>
> Does this work for you, or is there a further expectation?
>
> auto asTuple() { return Tuple!(int, "a", ...)(a, b, > >
stringValue);}
>
> -Steve

In fact, I was trying to use traits to create the tuple
automatically and being able to add or remove methods to the
struct without breaking the asTuple method.
I used allMembers for the name of the methods, but I didn't found
anything for their return types or their values.

Thank you.
http://dlang.org/phobos/std_traits.html#ReturnType
http://dlang.org/phobos/std_traits.html#ParameterTypeTuple

These are interesting and can be useful, but allMembers returns strings
and not functions, so I can't apply ReturnType.

It's a *compile time* string. D is able to do some amazing things with
this :)

// assuming 'a' is the first member
mixin("alias aReturnType = ReturnType!(Example." ~
__traits(allMembers, Example)[0] ~ ");");
static assert(is(aReturnType == int));

Using foreach over allMembers, you can construct a perfect return
tuple using introspection and mixin.

-Steve

I would never have thought about mixins, this is amazing ! But thinking
at compile time still is a little difficult for me, and now I don't
understand how you can construct your tuple. I've been trying to create
a string, by iterating on allMembers and concatenating the result of my
functions in a string. But of course, I cannot use this string at
compile time.

Now I know there is a way t do it, but my brain just can't figure it out.

Can you help me ?

The string must stay compile time. This means it must be calculated:

1. in a mixin statement

Example is what I wrote earlier.

2. as an initializer to an immutable, enum, or non-local variable

enum x = "Blah." ~ __traits(allMembers, Blah)[0]; // x is compile-time

3. inside a CTFE function. A CTFE function is just a normal runtime function with restrictions (see http://dlang.org/function.html#interpretation). But you must *call* it from a context like 1 or 2:

string foo(string a, string b) { return a ~ b; } // foo is CTFEable

auto x1 = foo("a", "b"); // x1 is a runtime string, foo is called at runtime
enum x2 = foo("a", "b"); // x2 is a compile-time string, foo is executed at compile time (it is not called during execution of your program
mixin("int " ~ x1 ~ ";"); // error, can't use runtime string x1
mixin("int " ~ x2 ~ ";"); // ok, declares int ab;
mixin("int " ~ foo("c", "d") ~ ";"); // ok, declares int ab;

Keep your code all executing at compile time, and you can use your strings to write your code for you!

-Steve

Reply via email to