On Wednesday, 15 March 2017 at 17:27:35 UTC, ag0aep6g wrote:
Phobos has it: std.meta.aliasSeqOf "converts an input range [...] to an
alias sequence." [1]

Woops, forgot to give the URL for that "[1]". Here it is:

http://dlang.org/phobos/std_meta.html#aliasSeqOf

Hello, I have a similar problem. For the life of me I can't make CTFE work while manipulating collections. Source:

import std.meta;
import std.traits;

template isFunctionField(OwnerType, string field_name)
{
        enum isFunctionField =
                isFunction(mixin(OwnerType.stringof ~ "." ~ field_name));
}

string[] sfilter(T)(string[] fields)
{
        string[] result;
        foreach (f; fields)
        {
                enum isfunc = isFunctionField!(T, f);
// variable f cannot be read at compile time.
// Even when I change isFunctionField from template to function that returns
// bool and takes "string field_name".
                if (isfunc)
                        result ~= f;
        }
        return result;
}

string[] TypeFields(T)() pure
{
        enum field_names = [__traits(allMembers, T)];
        pragma(msg, typeof(field_names)); // prints string[]
        pragma(msg, field_names);         // prints correct member names
        enum filtered = sfilter!(T)(field_names);
        return filtered;
}

//then I call it by:
enum fields = TypeFields!(SomeStruct)();

I can get string array of class members allright. Whenever I try to do any logic with it, I fail. I get that "enum field_names = " is not lvalue. How should I pass it to sfilter? When I change foreach loop into for loop, I can't index "string[] fields" array since "variable fields cannot be read at compile time". Should I pass field_names string array as some other type, AliasSeq or something?

The thing is, on some level inside TypeFields, I will need to mutate array, I can't stick to tuples. I tried declaring array parameters immutable, but CTFE forbids casting from mutable into immutable. I'm kinda out of ideas.

Reply via email to