如何在 const 数组上使用 front()

How to use front() on a const array

我有这个函数,extract(),它接受一个范围和一个成员的名字,然后尝试创建一个包装范围,其 front() 只提供对命名成员的访问。

问题出在Range.front(),当R的形式是const(T)[]。编译器指示函数 r.front() 不存在。我相当确定非 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);
}

事实证明,如果您要使用数组,则需要 std.range.primitives.front(),并且由于名称绑定尽可能紧密,因此不存在名称冲突(如果 R 实现 front() 它被调用而不是 std.range).

但是,由于我不明白的原因,您不能选择性地导入它。您必须导入所有 std.range.primitives.

无论如何,给定一个结构 S:

struct S {
    string name;
}

还有一个数组:

const(S)[] a = [S("A"), S("B")];

正确调用test.extract!"name"()returns["A", "B"].

首先。如果你想保留你的实现,你应该替换

import std.range: ElementType, isInputRange;

import std.range: ElementType, isInputRange, front;

ElementType!R front () { mixin("return r.front." ~ member ~ ";"); }

auto front () { mixin("return r.front." ~ member ~ ";"); }

但是。 你的实现太复杂了

可能更简单。

刚刚

auto extract1 (string member, R)(R range)
    if((hasMember!(ElementType!R, member)) && isInputRange!R)
{
    return range.map!("a." ~ member);
}