Простой l oop внутри шаблона - переменная 'x' не может быть прочитана во время компиляции - PullRequest
1 голос
/ 02 февраля 2020

(Обратите внимание, что я очень плохо знаком с DLang (первый день), поэтому я, вероятно, делаю что-то очень глупое)

Я пытаюсь создать шаблон миксина для повторного использования в доменные классы моего приложения, которые автоматически генерируют метод toString1() во время компиляции, который будет l oop через реализующие свойства struct и генерирует код для их печати. ​​

Для выполнения sh это, я получаю массив const всех свойств структуры и пытаюсь пропустить через них oop. Тем не менее, когда я пытаюсь получить доступ к индексу внутри l oop (который должен прекрасно выполняться во время компиляции - поскольку мы выполняем циклы с известным значением), он завершается неудачей.

Он работает совершенно нормально, если Я использую жестко закодированные индексы.

template Printable() {
    import std.algorithm.iteration;
    import std.conv;
    import std.meta;
    import std.stdio;
    import std.format;
    import std.range;
    import std.typecons;

    string toString1() const {
        const auto traits = __traits(allMembers, typeof(this));
        const auto internalWrap = (const string s) => "`" ~ s ~ ": ` ~ this." ~ s ~ " ~ `\n`";

        const auto ret = iota(0, traits.length)
            .map!((const int x) => traits[x])       // Error: variable x cannot be read at compile time
            .fold((a, b) => a ~ b);

        pragma(msg, internalWrap(traits[0]));       // WORKS GREAT


        return "";
    }
}

(просто обратите внимание, что я также пытался сделать это, используя оба цикла for, но он завершился ошибкой с той же ошибкой).

...