Pull to refresh

Comments 9

Checked!(Checked!(int, ProperCompare), WithNaN)
Лучше позволить Checked принимать произвольное число аргументов, тогда можно писать просто:


Checked!(int, ProperCompare, WithNaN)
Не очень понятно, как такое сделать. Либо нужно научиться сливать вместе несколько хуков, либо придётся переписать почти весь Checked.

Типичный способ это сделать — брать тип, первый хук и… хвост, заворачивать тип в хук и рекурсивно вызвать себя с новым типом и хвостом.

hasMember фактически неюзабелен — ложнопозитивно врёт когда его применяют к объектам, использующим opDispatch. Лучше использовать __traits compiles
Действительно. Можно было бы ещё заменить его на свою функцию вроде такой:
bool isMember(T, string name)()
{
    return staticIndexOf!(__traits(allMembers, T), name) >= 0;
}

Как то мне показалось, что в более молодых языках типа rust, swift, kotlin это все элегантнее выглядит.

Спасибо за статью. Очень интересно написано. Не знаком с D, поэтому прошу прощения за глупый вопрос. Верно ли понимаю, что возможность вызова операторов времени компиляции, позволяет выполнять расширение методов языка без дополнительных накладных расходов? И это, вероятно, важно в данной статье.

Вопрос к первому условию, к самому первому if, в примере кода:
ref Checked opUnary(string op)() return
if (op == "++" || op == "--")
{
    static if (hasMember!(Hook, "hookOpUnary"))
        hook.hookOpUnary!op(payload);
    else
    static if (hasMember!(Hook, "onOverflow"))
    {
        static if (op == "++")
        {
            if (payload == max.payload)
                payload = hook.onOverflow!"++"(payload);
            else
                ++payload;
        } else
        {
            if (payload == min.payload)
                payload = hook.onOverflow!"--"(payload);
            else
                --payload;
        }
    } else
        mixin(op ~ "payload;");
    return this;
}


Условия не static if, а простое if. Сказывается ли это по последующей скорости выполнения программы?
1) да, всё то, что можно сделать во время компиляции, делается там.
2) это такой синтаксис template constraint'ов, он по сути static, например:
T fun(T)(T x, T y)
if (isIntegral!T)    // пройдёт только целый тип
{
    return x + y;
}
UFO just landed and posted this here
Sign up to leave a comment.

Articles