有没有办法混合函数名称(或任何类型的成员名称)而不是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”将是函数名称。在这种情况下属性函数。
我只是好奇是否有更好的方法来实现这一目标。
答案 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