如何在 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);
}
我有这个函数,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);
}