On Wednesday, 18 December 2019 at 22:17:21 UTC, tirithen wrote:
On Wednesday, 18 December 2019 at 22:11:10 UTC, Sebastiaan Koppe wrote:

If you know all types up front you can use the Sumtype library on code.dlang.org

Thanks, it's a good starting point, the best would be if I only needed to define that the struct would implement void applyTo(ref User user) so that could be run in the loop to update the User entity.

If all of the structs need to implement a particular method (or set of methods), you can use an interface and a templated adapter class to give them a common type. Here's a simple example:

import std.stdio: writeln;

struct User
{
    string name;
}

interface Action
{
    void applyTo(ref User);
}

class ActionAdapter(T) : Action
{
    T payload;

    this(T payload)
    {
        this.payload = payload;
    }

    override void applyTo(ref User user)
    {
        payload.applyTo(user);
    }
}

Action action(T)(T payload)
{
    return new ActionAdapter!T(payload);
}

struct SayHello
{
    void applyTo(ref User user)
    {
        writeln("Hello, ", user.name, ".");
    }
}

struct SayGoodbye
{
    void applyTo(ref User user)
    {
        writeln("Goodbye, ", user.name, ".");
    }
}

void main()
{
    Action[] actions = [action(SayHello()), action(SayGoodbye())];
    auto user = User("Joe Schmoe");

    foreach (action; actions)
        action.applyTo(user);
}

Reply via email to