Mixin函数名称

时间:2015-03-06 12:21:15

标签: d

有没有办法混合函数名称(或任何类型的成员名称)而不是mixin字符串?

我目前正在这样做:

mixin template PacketValue(T, string name, PacketMode mode, size_t offset) {
    import std.string : format;

    static if (mode == PacketMode.both || mode == PacketMode.write) {
        enum writePacketFormat = "void %s(T value) { write!T(value, offset); }";
        mixin(format(writePacketFormat, name));
    }

    static if (mode == PacketMode.both || mode == PacketMode.read) {
        enum readPacketFormat = "auto %s() { return read!T(offset); }";
        mixin(format(readPacketFormat, name));
    }
}

它用于前。像这样:

class WritePacket : Packet!(PacketMode.write) {
    public:
        this(ushort size) {
            super(cast(ushort)1001, cast(ushort)(4 + size));
        }


    @property {
        mixin PacketValue!(uint, "value1", PacketMode.write, 4);
        mixin PacketValue!(uint, "value2", PacketMode.write, 8);
        mixin PacketValue!(ushort, "value3", PacketMode.write, 12);
    }
}

其中“value1”,“value2”和“value3”将是函数名称。在这种情况下属性函数。

我只是好奇是否有更好的方法来实现这一目标。

1 个答案:

答案 0 :(得分:0)

另一种方法是opDispatch,其名称为模板条件。

mixin template PacketValue(T, string name, PacketMode mode, size_t offset) {

static if (mode == PacketMode.both || mode == PacketMode.write)
{
    void opDispatch(string op,T)(T value) if (op == name)
    {
        write!T(value, offset);
    }
}

static if (mode == PacketMode.both || mode == PacketMode.read)
{
    auto opDispatch(string op)() if (op == name)
    {
        return read!T(offset);
    }
}

}

虽然您可以将其简化为单个opDispatch