d检测输出区间的元素类型
原文
我在处理输出区间,如果每次都调用.put(T)
,则效率太低.
自然,我可为该资源
制作自定义OutputRange
,但我想搞个通用的批次调用
放的BufferedOutputRange
.
在为缓冲输出区间
设计模板时,我先在给定输出区间
上用ElementType
,希望检测允许.put(T)
的类型.但是,我发现ElementType
仅适用于输入区间
.
为此,问题是,用模板好不?假设区间带我可检测到的数组
的put
方法是否安全?思路行不?或者要求程序员显式声明输出类型
,来避免用不带数组
区间?
import std.range;
import std.traits;
// 考虑输出区间的`std.range.ElementType`特化
template ElementType(R)
if (is(typeof(R.put) == function)) // 避免与std.range.ElementType冲突.
{
// 生成代码,非真正的循环
static foreach (t; __traits(getOverloads, R, "put")) {
pragma(msg, "发现放方法,参数=", Parameters!(t).length);
// 已生成代码,用`完成`别名来告诉何时停止
static if (!is(done)) {
// 保存Parameters!(t)失败,重复
static if (Parameters!(t).length == 1 && is(Parameters!(t)[0] T : T[])) {
pragma(msg, "找到数组方法");
// 用T置模板替换为ElementType!(...).
alias ElementType = T;
alias done = bool;
} else static if (Parameters!(t).length == 1 && is(Parameters!(t)[0] T)) {
pragma(msg, "找到单个放");
alias ElementType = T;
alias done = bool;
}
}
}
static if (!is(done)) {
alias ElementType = void;
}
}
unittest {
// 对构单元素放管用.
struct Ham0(T) {
void put(T d) {}
}
assert(is(ElementType!(Ham0!float) == float));
// 有数组放的类,管用
class Ham1(T) {
void put(T[] d) {}
}
assert(is(ElementType!(Ham1!float) == float));
// 忽略分发函数,如支持`单个/数组`放,则元素类型仍然正确
struct Ham2(T) {
void put() {}
void put(float f, T[] d) {}
void put(T[] d) {}
void put(T d) {}
}
assert(is(ElementType!(Ham2!int) == int));
}
试试
该方法要求调用者
显式声明输出区间
元素类型,要避免它.
一般按模板实现put
,很难.
问题是,需要吗?在已知元素类型
时,在自己实现的放
中,你的BufferedOutputRange
可用是输出区间
来测试底层区间
,即测试是否可批量
写切片或元素区间,或必须调用
每个元素的放
.
我发现了.在Appender和RefAppender
中的放
,算法
不能检测put
方法.
让用户传入类型,然后检查
isOutputRange!(ORangeT, ElemT)
//和
is(typeof(ORangeT.init.put([ ElemT.init ])))
.可多种方式满足isOutputRange
.但我想进一步限制只能输出可批量放
的流
.
自动检测
很方便,期望调用者
知道插入元素类型
也是合理的.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现