d调用复制内存
import std;
struct ParseError { string msg; }
alias ParseErrorOr(T) = SumType!(ParseError,T);
auto parseErrorOr(T)(T x) { return ParseErrorOr!T(x); }
auto parserOr(I,fs...)(I i) {
alias RetType = typeof(fs[0](I.init));
auto cur = RetType(ParseError.init);
foreach(f;fs) {
if(cur.match!((ParseError e)=>false,_=>true)) { return cur; }
cur = f(i); //本行.
}
return cur;
}
auto parseNothing(I)(I i) {
return parseErrorOr(tuple(i[0..0],i));
}
void main()
{
enum a = parserOr!(string,parseNothing!string,parseNothing!string)("hello");
}
在core.lifetime
中的moveEmplaceImpl
发生.
而如下工作:
import std;
struct ParseError { string msg; }
alias ParseErrorOr(T) = SumType!(ParseError,T);
auto parseErrorOr(T)(T x) { return ParseErrorOr!T(x); }
auto parserOr(I,alias f, alias g)(I i) {
auto cur = f(i);
if(cur.match!((ParseError e)=>false,_=>true)) { return cur; }
return g(i);
}
auto parseNothing(I)(I i) {
return parseErrorOr(tuple(i[0..0],i));
}
void main()
{
enum a = parserOr!(string,parseNothing!string,parseNothing!string)("hello");
}
在moveEmplace
中,可能在SumType
里面.
还可这样:
auto parserOr(I,fs...)(I i) if(fs.length>=2) {
auto cur = fs[0](i);
if(cur.match!((ParseError e)=>false,_=>true)) { return cur; }
static if(fs.length==2) { return fs[1](i); }
else { return parserOr!(I,fs[1..$])(i); }
}
也工作,
进一步化简:
import std.sumtype;
struct Tuple
{
void opAssign(Tuple rhs) {}
}
alias ParseErrorOr = SumType!Tuple;
auto parserOr() {
ParseErrorOr cur;
cur = ParseErrorOr(Tuple());
return cur;
}
void main()
{
enum a = parserOr();
}
move
来自SumType.opAssign
.
ctfe
中不能用opAssign
赋值struct
给SumType
.
链接.
链接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现