2311d,模板上的推导类型

news/2024/7/7 20:49:30

原文
我正在试实现替代的基础库,来避免模板/mixin/static/traits代码,只为了:使得更容易解析"智能感知"代码.
我需要"泛型",但D没有泛型:我按"最简单"方式使用模板.
即:

interface IIterable(T)
{
  bool empty();
  void popFront();
  T front();
}
IIterable!S toIterable(S)(S[] source)
  => new ArrayIterable!S(source);
IIterable!S filter(S)(IIterable!S source, bool delegate(S item) predicate)
  => new Filter!S(source, predicate);
IIterable!S filter(S)(S[] source, bool delegate(S item) predicate)
  => toIterable(source).filter(predicate);
//...

然后,在main.d中,我:

import std.stdio;
void main(){
  [1,2,3,4,5,6].toIterable!int.filter!int(i=>i%2==0).map!int(i=>i*2).toArray.writeln();
}

它工作正常,直到我从过滤(filter)方法中删除!int.
main.d(3,38):错误:"filter"模板的重载不能使用参数类型"!()(IIterable!int,void)'.
iterable.d(21,13):候选者为:
filter(S)(IIterable!S source, bool delegate(S item) predicate)
iterable.d(23,13):'filter(S)(S[]source,booldelegate(Sitem)predicate)'
基本上,它不知道要用的哪个版本过滤器,因为它推导i=>i%2==0空(void)?!

!()(IIterable!int, void)

如果显式写入(int i)=>i%2==0,它会再次正确编译.
IIterable!S source已经是IIterable!int,是否必须显式告知S是int?

这是编译器的错误/限制.我找不到有关issues.dlang.org的现有报告,因此提交了.

目前,最好是在λ中指定类型,如(int i)=>i%2==0.
看到void的原因是,编译器无法确定函数字面类型时,会当作模板函数:

static assert(__traits(isTemplate, i => i % 2 == 0));

出于愚蠢的历史原因,编译器试确定模板类型时,它会返回void而不是给出错误:

template example() {}
static assert(is(typeof(example) == void)); //什么

http://lihuaxi.xjx100.cn/news/1827178.html

相关文章

巧用ChatGPT快速提高职场晋升力、搞定数据分析玩、转新媒体运营

文章目录 一、引言二、ChatGPT在日常工作中的应用场景1. 客户服务与支持2. 内部沟通与协作3. 创新与问题解决 三、巧用ChatGPT提升工作效率1. 自动化工作流程2. 信息整合与共享3. 提高决策效率 四、巧用ChatGPT创造价值1. 优化产品和服务2. 提高员工满意度和留任率 五、总结与展…

企业数字化转型的作用是什么?_光点科技

在当今快速变化的商业环境中,数字化转型已成为企业发展的重要策略。企业数字化转型指的是利用数字技术改造传统业务模式和管理方式,以提升效率、增强竞争力和创造新的增长机会。 提升运营效率:数字化转型通过引入自动化工具和智能系统&#x…

JMeter测试报错422 Unprocessable Entity

添加HTTP信息头: ​ HTTP请求-》添加-〉配置元件-》HTTP信息头管理器 ​ 如果需要送json,需要添加Content-Type:application/json,否则会报【422 Unprocessable Entity】

从文本生成到数据增强:探索 AI 前沿的开源套件 | 开源专题 No.44

Significant-Gravitas/AutoGPT Stars: 150.4k License: MIT AutoGPT 是开源 AI 代理生态系统的核心工具包。它采用模块化和可扩展的框架,使您能够专注于以下方面: 构建 - 为惊人之作打下基础。测试 - 将您的代理调整到完美状态。查看 - 观察进展成果呈…

acwing算法基础之数学知识--求组合数基础版

目录 1 基础知识2 模板3 工程化 1 基础知识 (一) 组合数 C n k C_n^k Cnk​的计算公式, C n k n ! k ! ⋅ ( n − k ) ! C_n^k\frac{n!}{k!\cdot (n-k)!} Cnk​k!⋅(n−k)!n!​ 故可以这样计算, int compute_combination_n_k(…

千兆光模块和万兆光模块的发展趋势

千兆光模块和万兆光模块是一种高速光电子器件,以其高速传输、长距离传输和高可靠性而广受关注。光模块是光学通讯系统中极为重要的组成部分之一。不同类型的光模块由于其不同的特性,可以适用于不同的应用场景。下面我们将着重介绍千兆光模块和万兆光模块…

在.bashrc文件修改环境变量的做法

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> ~/.bashrc文件是linux下保存环境变量的系统文件。原以为使用sed命令修改.bashrc文件,实际上不行,需要使用echo命令。具体示例如下…

vtk数组操作

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题&#xff1a;vtk数组操作 ArrayLookup&#xff1a;获取指定值vtkIdType 索引或索引集合 distances->LookupValue(15); //或者 vtkNew<vtkIdLis…