У меня есть эта функция, extract()
, которая принимает диапазон и имя члена, затем пытается создать диапазон переноса, чей front()
обеспечивает доступ только к названному члену.
Проблемалежит в Range.front()
, когда R имеет форму const(T)[]
.Компилятор указывает, что функция r.front()
не существует.Я вполне уверен, что что-то не так с взаимодействием между non-const
R и const r.front()
, но я не уверен, как его решить.
Итак, правильна ли моя интуиция?И в любом случае, что именно не так, и как я могу это исправить?
auto extract (string member, R)(R range) {
import std.traits: hasMember;
import std.range: ElementType, isInputRange;
static assert(hasMember!(ElementType!R, member));
static assert(isInputRange!R);
struct Range {
R r;
bool empty ()() { return r.empty; }
void popFront ()() { r.popFront; }
ElementType!R front () { mixin("return r.front." ~ member ~ ";"); }
}
return Range(range);
}