(Обратите внимание, что я очень плохо знаком с 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, но он завершился ошибкой с той же ошибкой).