Thread overview
How do I assign attributes of a function to another function?
Nov 05, 2021
Li30U
Nov 05, 2021
Stanislav Blinov
Nov 05, 2021
Stanislav Blinov
November 05, 2021

I am creating a templated object that is a storehouse for a heap object and executes their methods and returns an array of results. With the help of a template, I want to achieve this, but I want to assign the same attributes to the function. How can one pass the attributes of a function to another function?

template Group(T, int objects)
{
    struct Group
    {
        enum __length = __traits(allMembers, T).length;

        T[objects] __objects;

        this(T[objects] __objctor) @safe
        {
            __objects = __objctor;
        }

        static foreach (member; __traits(allMembers, T))
        {
            static if ( __traits(getVisibility, __traits(getMember, T, member)) != "private" &&
                        __traits(getVisibility, __traits(getMember, T, member)) != "protected")
            {
                static if (isFunction!(__traits(getMember, T, member)))
                {
                    mixin ("ReturnType!(__traits(getMember, T, member))[] " ~ member ~ "(Parameters!(__traits(getMember, T, member)) args)
                    {
                        ReturnType!(__traits(getMember, T, member))[] results;
                        foreach (e; __objects)
                            results ~= e." ~ member ~ "(args);

                        return results;
                    }");
                }else
                static if (member != "Monitor")
                {
                    mixin ("typeof(__traits(getMember, T, member))[] " ~ member ~ "()
                    {
                        typeof(__traits(getMember, T, member))[] results;
                        foreach (e; __objects)
                            results ~= e." ~ member ~ ";
                        return results;
                    }");
                }
            }
        }
    }
}
November 05, 2021

On Friday, 5 November 2021 at 06:19:16 UTC, Li30U wrote:

>

I am creating a templated object that is a storehouse for a heap object and executes their methods and returns an array of results. With the help of a template, I want to achieve this, but I want to assign the same attributes to the function. How can one pass the attributes of a function to another function?

There's https://dlang.org/spec/traits.html#getFunctionAttributes . Or you could define your functions as function templates, letting the compiler infer attributes. Especially as it looks like you function's attributes may not be made the same as the ones you defer to: since you're allocating with the GC, your function cannot be @nogc even if a deferred one can.

November 05, 2021

On Friday, 5 November 2021 at 06:19:16 UTC, Li30U wrote:

...e.g.

// ...
mixin ("ReturnType /*...snip...*/ " ~ member ~ "()(Parameters! /*...snip...*/

Note the () before parameter list. This would make your member function a function template, for which attributes will be inferred by the compiler based on the calls you make in the function body.

Of course, making it a template like this makes it non-composable with that same type as you're only inspecting functions, so you wouldn't be able to do e.g. a Group!(Group!(A, 3), 4);