d改进重载2

原文
理由:目前,查看通过别名参数传递给模板重载集时,不能提取重载集.一般,可用:

__traits(getOverloads, __traits(parent, sym), __traits(identifier, sym))

但只要重载集包含别名其他模块,此操作就会失败.而

__traits(getOverloads)

始终内部查找符号,所以只需要重定义个单参(当前是错误)来直接传递该符号.

需要定义存在导入重载集时的行为:

// a.d
void foo(int);
void foo(string);

// b.d
void foo();

// c.d
import a;
import b;

__traits(getOverloads, foo);   // 哪个?

我在本地测试了一下,只有在同一个模块中定义并使用重载集,才是问题.如,有效的:

// b.d
void first(int) { }

// c.d
void second(string) { }

// a.d
import b : foo = first;
import c : foo = second;

// d.d

import a;

void main()
{
    alias overloads = __traits(getOverloads, a, "foo");
    static foreach(ov; overloads)      
        pragma(msg, __traits(identifier, ov));
}

因此,如果知道重载集定义位置,事情就会正常工作.
所以取别名参数的模板现在需要传递调用模块和串?
你在此陷入了一点C++思维.你不应问"能用已拥有的东西做吗",而是"这是还是?",这样做是不好的.没人想你不能写:

templ!foo

你应该写:

templ!(net.foo.CurrentModule, "foo")

认为是的,这是个很好的,设计良好语言,我应该推荐给其他人.

posted @   zjh6  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示