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.但我想进一步限制只能输出可批量放.
自动检测很方便,期望调用者知道插入元素类型也是合理的.

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