当前位置: 首页 > news >正文

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();
}

我不认为这比DIP1036eDIP1027简单.简单的转换就是简单的转换.当然,编译时传递格式串的混合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、原理 建造者模式又叫生成器模式,是一种对象的构建模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。创建者模式是一步一步创建一个复杂的对象&#xf…...

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/…...

【二、自动化测试】为什么要做自动化测试?哪种项目适合做自动化?

自动化测试是一种软件测试方法&#xff0c;通过编写和使用自动化脚本和工具&#xff0c;以自动执行测试用例并生成结果。 自动化旨在替代手动测试过程&#xff0c;提高测试效率和准确性。 自动化测试可以覆盖多种测试类型&#xff0c;包括功能测试、性能测试、安全测试等&…...

用ChatGPT来造一个ChatGPT:计算机领域智能问答系统实践(2)

在PHP语言中&#xff0c;你可以使用MySQL数据库来存储知识库&#xff0c;并使用PHP来实现系统的逻辑。以下是一个简单的示例&#xff1a; 创建数据库表&#xff1a; 首先&#xff0c;创建一个名为 computer_knowledge 的表来存储计算机知识。可以使用以下SQL语句&#xff1a;…...

Ubuntu开机自动挂载硬盘

前言&#xff1a; 因为我的电脑是WIN10 Ubuntu18.04双系统&#xff0c;且两个系统都装在C盘上&#xff0c;而D盘作为数据和代码存储盘&#xff0c;经常会开机就被访问&#xff0c;例如上一次关机前用VS Code访问D盘代码&#xff0c;然后下一次开机的时候打开VSCode发现打不开…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

华硕a豆14 Air香氛版,美学与科技的馨香融合

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

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库&#xff0c;用于数据验证和设置管理&#xff0c;通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发&#xff08;如 FastAPI&#xff09;、配置管理和数据解析&#xff0c;核心功能包括&#xff1a; 数据验证&#xff1a;通过…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...