2401d,讨论d串滑动参数
原文
因为对编译时执行的i串
的兴趣,我一直在考虑搞个通用用例
,而不是相关i串
的用例.
滑动模板参数
请考虑以下模板:
void pluto(string s)()
{pragma(msg, s);
}
void test()
{pluto!"hello"();
}
因为s
是编译时参数,这编译,而pragma(msg,s)
期望s
为编译时值.
void pluto()(string s)
{pragma(msg, s);
}
void test()
{pluto("hello");
}
这无法编译,因为即使它是内联
的,s
也是编译时不可访问的运行时参数
.在此内联
没用,因为内联
是在CTFE
和分析
语义后进行的.
这些示例说明了编译时参数和运行时参数
间的区别.
为了说明,生成元素元组
:
alias AliasSeq(T...) = T;
及接受元组
的函数参数列表
:
void func(Args...)(Args args)
{
}
但注意,args
是运行时参数.表明,它无法用元组
拆分参数元组
为编译时
元组和运行时
元组,类似如下:
void pluto(Args...)(Args args)
{exec!(args[0])(args[1 .. args.length]);
}
这是DIP1036e
遇见的问题
.它聪明
的是让编译器(因为它不能通过元编程
完成)取第一个参数
,并用作模板
挂名值的编译时参数
.
然后,该参数
类型,是个把值编码
为可编程提取并编译时处理
的类型的模板
.
尴尬
在它只在i串
上,而不是通用
功能,再加上插入挂名参数
到参数列表
中,只为了可提取它们的类型
.
因此,该提案
描述了从运行时
的表达式元组
创建编译时参数
的语言能力
.
因为缺乏更好术语
,我叫它"滑动模板参数"
.
考虑一个模板函数
:
void pluto(string s, Args...)(Args args)
{pragma(msg, s);
}
void exec()
{pluto!"hello"(1,2,3);
}
现在有效.但如下无法编译
:
pluto("hello",1,2,3);
因为没有s参数
.
因此,编译器可滑动参数
到左侧
,而不是发出编译错误
,因此把第一个参数
移动到编译时参数列表
中.然后,调用
就会编译.
规则类似:
1
.该函数是个带可变运行时参数列表
的模板
2
.编译时参数是N个值
参数序列,加可变类型参数
.
3
.值参数
没有默认值
4
.模板
调用中未提供编译时参数
5
.最左边的N个
运行时参数与编译时参数
匹配,并从运行时参数列表
中删除
6
.如果它们匹配,则重写
模板实例化
来反映
这一点
7
.然后正常编译
然后,滑动模板
可成为一个通用设施
.有趣的结果
是,它开辟了一类全新的函数
,现在可对最左边
的参数CTFE
计算.
总之,这是个好主意
,但建议的语法
有点过于特化
,受到任意限制
,且行为
可能是意想不到
的,应该选入
.
也许可这样做:
void pluto(string s, Args...)(enum string x = s, Args args){
}
也即,可在函数参数列表
中使用枚举
,且必须默认
初化它们.即此参数
总是需要
有该值.
然后,在编译时计算
与枚举
参数匹配的参数,并匹配
初化器.
我昨天开始研究1036e
模板的替代机制
.我提到了这一点.
可在调用点
传递UDA
,并可在模板
函数中通过__traits(getAttributes,parameter)
访问它.
i"$ident$(expr)$(ident:format)${1:format}"
//变为:
@IExpression("ident")
ident,
@IExpression("expr")
expr,
@IExpression("ident")
@IFormat("format")
ident,
@IFormat("format")
@IPosition(1)
IPosition.init
这将是一个通用语言功能
.
string username, password;
getopt(@description("My program")@description("Second line")commandsInfo,@description("My programs help info")@flag("help") @flag("h") helpInfo,@description("The username to connect with")@flag("username") @flag("u") username,@description("The password to connect with")@flag("password") @flag("p") password
);
我已模拟了getopt
,唯一额外的模板用法
是formattedRead
.这是一个通用功能,串插值
也可绑定它.
这是个可行的方法
.但仍没有格式串
(writef
).
如果用它来实现插值元组
,我会让第一个参数
类型是
struct Interpolation {immutable string[] parts;
}
因此编译器
会这样:
void foo(Interpolation interp, Args...)(Args args) {...}
void main()
{string name = "Steve";int age = 42;foo(i"Hello, $name, I see you are $age years old.");//相当于:foo!(Interpolation(["Hello, ", "name", ", I see you are ", "age", " years old."]))(name, age);
}
按参数
出现的顺序传递参数
仍有价值.如,这禁止带多个i串
的函数.但也许没关系.
另一个有趣
的发展是,也可在运行时
取串字面数据(喜欢或同意
运行时处理串字面数据
时):
void writeln(Args...)(Interpolation interp, Args args)
{assert(interp.parts.length == args.length * 2 + 1);write(interp.parts[0]); //总是是前导串;static foreach(i; 0 .. args.length)write(args[i], interp.parts[(i+1)*2]);writeln();
}
我不认为这比DIP1036e
或DIP1027
简单.简单的转换就是简单的转换
.当然,编译时
传递格式串
的混合DIP1027
仍不可行.
但会稍微不那么臃肿.
如果该机制
是让它越过终点线
的原因,我可妥协.
这是可实现
和玩的东西吗?
这似乎有可能
破坏代码:
void foo(int x, Args...)(Args args) {
}
void foo(Args...)(Args args) {
}
foo(1, 2, 3); //这叫今天,第二个是
所以我会听从蒂蒙
的建议,也许确实需要明确选入
.
-史蒂夫
一个更现实
示例:
writefln("blah %d", 1)
因为writefln
(和format
)有串模板格式参数
版本.
即使选入,仍会决定(或抛
歧义错误)来匹配
重载.
-史蒂夫
相关文章:
2401d,讨论d串滑动参数
原文 因为对编译时执行的i串的兴趣,我一直在考虑搞个通用用例,而不是相关i串的用例. 滑动模板参数 请考虑以下模板: void pluto(string s)() {pragma(msg, s); } void test() {pluto!"hello"(); }因为s是编译时参数,这编译,而pragma(msg,s) 期望s为编译时值. voi…...
etcd官方docker镜像及dockerfile问题处理
解决下我之前etcd使用docker镜像启动的坑 1、问题镜像docker-file: 这个dockerfile看着看不出来问题,但如果有人真的执行我之前两篇文章的文件,就会有问题,什么问题呢,无法连接到etcd,由于我是刚装上docker,排查了一圈,包括docker网络及是否是本地docker的网络问题,…...

2023 IoTDB Summit:天谋科技高级开发工程师苏宇荣《汇其流:如何用 IoTDB 流处理框架玩转端边云融合》...
12 月 3 日,2023 IoTDB 用户大会在北京成功举行,收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题,多位学术泰斗、企业代表、开发者,深度分享了工业物联网时序数据库 IoTDB 的技术创新…...

Pygame程序的屏幕显示
不同对象的绘制与显示过程 在Pygame中,需要将所有需要在屏幕上显示的内容都绘制在一个display surface上。该Surface通常称为screen surface,它是pygame.display.set_mode()函数返回的Surface对象。 在绘制不同对象时,可以使用不同的绘制方…...

LVGL的List控件的触摸按键和实体按键的处理
在LVGL的List控件使用过程中,虽然通过触摸按键选择item,但是有些场景需要实体按键选取item,但是LVGL 的V8.3中没有像Emwin那样有函数选择list item的函数。LVGL中List引入了Group的概念,把列表项都添加到同一个group中。然后通过更…...

数据结构 模拟实现二叉树(孩子表示法)
目录 一、二叉树的简单概念 (1)关于树的一些概念 (2)二叉树的一些概念及性质 定义二叉树的代码: 二、二叉树的方法实现 (1)createTree (2)preOrder (…...

Android14之解决刷机报错:Can not load Android system. Your data may be corrupt(一百七十七)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...

二阶贝塞尔曲线生成弧线
概述 本文分享一个二阶贝塞尔曲线曲线生成弧线的算法。 效果 实现 1. 封装方法 class ArcLine {constructor(from, to, num 100) {this.from from;this.to to;this.num num;return this.getPointList();}getPointList() {const { from, to } thisconst ctrlPoint thi…...

FilterQuery过滤查询
ES中的查询操作分为两种:查询和过滤。查询即是之前提到的query查询,它默认会计算每个返回文档的得分,然后根据得分排序。而过滤只会筛选出符合条件的文档,并不计算得分,并且可以缓冲记录。所以我们在大范围筛选数据时&…...

java多线程(并发)夯实之路-线程池深入浅出
线程池 Thread Pool:线程池,存放可以重复使用的线程(消费者) Blocking Queue:阻塞队列,存放等待执行的任务(生产者) poll方法(有时限地获取任务)相对take注…...
数据库-列的类型-字符串char类型
char 和 varchar 类型 char 类型懂得都懂就是固定的字符串类型 char (maxLen) 例如 char(5) 这个长度为5 但插入数据‘a’时 是5 插入abc 也是5 即使插满固定 就像C/C语言里 char 字符数组一样 char str[64]; maxLen255 哈哈最多有255个字符多了我认为你是错误 varchar…...

大话 JavaScript(Speaking JavaScript):第二十一章到第二十五章
第二十一章:数学 原文:21. Math 译者:飞龙 协议:CC BY-NC-SA 4.0 Math对象用作多个数学函数的命名空间。本章提供了一个概述。 数学属性 Math的属性如下: Math.E 欧拉常数(e) Math.LN2 2 …...

ICMP协议
ICMP协议是网络层协议, 利用ICMP协议可以实现网络中监听服务和拒绝服务,如 ICMP重定向的攻击。 一、ICMP基本概念 1、ICMP协议 ICMP是Internet控制报文协议,用于在IP主机、路由器之间传递控制消息,控制消息指网络通不通、主机是…...

环信服务端下载消息文件---菜鸟教程
前言 在服务端,下载消息文件是一个重要的功能。它允许您从服务器端获取并保存聊天消息、文件等数据,以便在本地进行进一步的处理和分析。本指南将指导您完成环信服务端下载消息文件的步骤。 环信服务端下载消息文件是指在环信服务端上,通过调…...

创建型模式 | 建造者模式
一、建造者模式 1、原理 建造者模式又叫生成器模式,是一种对象的构建模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。创建者模式是一步一步创建一个复杂的对象…...
MVC设计模式
在当今的软件开发领域,MVC(Model-View-Controller)设计模式已经成为了一种广泛使用的架构模式。它为应用程序提供了一种结构化的方法,将数据、用户界面和业务逻辑分开,从而使得应用程序更易于维护、扩展和重用。 一、…...
WSL (2103) ERROR: CreateProcessEntryCommon:493: chdir 错误解决
[TOC](WSL (2103) ERROR: CreateProcessEntryCommon:493: chdir 错误解决) 1. 错误信息 <3>WSL (2103) ERROR: CreateProcessEntryCommon:493: chdir(/mnt/d/Program Files/PowerShell/7) failed 52. 解决方法 wsl --shutdownwslrefer: https://github.com/microsoft/…...

【二、自动化测试】为什么要做自动化测试?哪种项目适合做自动化?
自动化测试是一种软件测试方法,通过编写和使用自动化脚本和工具,以自动执行测试用例并生成结果。 自动化旨在替代手动测试过程,提高测试效率和准确性。 自动化测试可以覆盖多种测试类型,包括功能测试、性能测试、安全测试等&…...
用ChatGPT来造一个ChatGPT:计算机领域智能问答系统实践(2)
在PHP语言中,你可以使用MySQL数据库来存储知识库,并使用PHP来实现系统的逻辑。以下是一个简单的示例: 创建数据库表: 首先,创建一个名为 computer_knowledge 的表来存储计算机知识。可以使用以下SQL语句:…...

Ubuntu开机自动挂载硬盘
前言: 因为我的电脑是WIN10 Ubuntu18.04双系统,且两个系统都装在C盘上,而D盘作为数据和代码存储盘,经常会开机就被访问,例如上一次关机前用VS Code访问D盘代码,然后下一次开机的时候打开VSCode发现打不开…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...