递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 1676|回复: 6
打印 上一主题 下一主题

[视窗] 在火山视窗中使用c++模板(template)的方法

[复制链接]

69

主题

992

帖子

4478

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4478
跳转到指定楼层
楼主
发表于 2024-5-4 17:40:43 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 hcwanz 于 2024-5-6 13:49 编辑

灵感来源于PC实现变量引用指针替代读指针处对象 - 火山平台俱乐部 - 火山软件开发平台 - Powered by Discuz! (voldp.com)                                                                                                                                                                                用途:告别一长条的各种数组类型,拥抱std::array
遗憾:1.需要模板类型的火山方法必须为嵌入式方法(需要匹配所有类型),因此封装时基本要全部使用c++来写
2.只有加密狗用户可以使用所有类型,一般用户只能使用基础类型或设置了输出名的类型                                                 3.基本告别返回值了

思路如下图所示。



在定义“模板类”时,设置前缀文本“template <typename TYPE>\r\nCDECL”,我们就可以在后续c++代码中使用TYPE模板类型
其中template <typename TYPE>语句和类定义语句不能在一行,
而正常情况下,火山会删除前缀文本中的“\r\n”,所以CDECL等类似的协议是必须的(好像也可以用“/**/”格式的注释)。(搜了一下定义,发现template可以和类定义在一行,所以后缀\r\nCDECL是可以省略的)

在定义“模板类”变量时,设置后缀文本“<模板的实际类型>”,
这样在后续调用模板类型的方法时,模板类型TYPE会自动替换成“模板的实际类型”



回复

使用道具 举报

69

主题

992

帖子

4478

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4478
7#
 楼主| 发表于 2024-5-4 20:07:41 | 只看该作者
本帖最后由 hcwanz 于 2024-5-4 20:30 编辑
Xelloss0618 发表于 2024-5-4 19:50
何必这么复杂,这样就行,也不是很方便使用

其实还行,基础类型就用 取整数、取文本。。。。,火山类可以通用 取成员
回复

使用道具 举报

69

主题

992

帖子

4478

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4478
6#
 楼主| 发表于 2024-5-4 20:01:35 | 只看该作者
本帖最后由 hcwanz 于 2024-5-6 13:51 编辑
Xelloss0618 发表于 2024-5-4 19:50
何必这么复杂,这样就行,也不是很方便使用

不用限定成员必须为静态。
实际封装的时候,除非像字节集类那样在c++层面封装好,不然往往是需要自己从火山层面再小改一下的,这时候别名类就不是这么友好了。
回复

使用道具 举报

26

主题

1904

帖子

6941

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6941
5#
发表于 2024-5-4 19:50:02 | 只看该作者
何必这么复杂,这样就行,也不是很方便使用

<火山程序 类型 = "通常" 版本 = 1 />

类 标准数组类 <公开 @别名 = "std::vector" @别名类型 = 本地类 @视窗.外部头文件 = "<vector>">
{
    方法 取成员数 <公开 静态 类型 = 整数 注释 = "返回数组中的当前已有成员数目" 折叠 @嵌入式方法 = "">
    参数 当前对象 <类型 = 标准数组类>
    {
        @ (INT)@<当前对象>.size()
    }

    方法 加入成员 <公开 静态 注释 = "将一个所指定类型的成员值加入到本数组的尾部" 折叠 @嵌入式方法 = "">
    参数 当前对象 <类型 = 标准数组类>
    参数 欲添加成员 <@匹配类型 = 所有类型>
    {
        @ @<当前对象>.push_back(@<欲添加成员>)
    }

    方法 取成员 <公开 静态 注释 = "返回所指定索引位置处的成员值" 折叠 @嵌入式方法 = "">
    参数 当前对象 <类型 = 标准数组类>
    参数 索引位置 <类型 = 整数 注释 = "提供所欲操作成员的索引位置,必须大于等于0且小于数组成员数目.">
    参数 成员类型 <注释 = "提供返回成员值的数据类型" @需求类型 = 数据类型 @匹配类型 = 所有类型 @返回值类型 = 0>
    {
        @ (@<成员类型>&)@<当前对象>[@<索引位置>]
    }
}

类 用例
{
    方法 例子
    {
        变量 文本数组 <类型 = 标准数组类 @视窗.后缀文本 = "<CVolString>">
        文本数组.加入成员 ("你好")
        加入文本 (文本数组.取成员 (0, 文本型), "火山")
        调试输出 (文本数组.取成员数 (), 文本数组.取成员 (0, 文本型))
    }
}
回复

使用道具 举报

69

主题

992

帖子

4478

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4478
地板
 楼主| 发表于 2024-5-4 18:15:45 | 只看该作者
本帖最后由 hcwanz 于 2024-5-4 20:35 编辑
呵呵仙8 发表于 2024-5-4 18:06
我一直想问一下.有@嵌入式方法的子程序转c++代码后,还是否存在下判断这个方法外衣?? ...

不存在了,直接替换成了c++语句,所以有很多限 制,也有很多自 由
回复

使用道具 举报

50

主题

567

帖子

2481

积分

金牌会员

Rank: 6Rank: 6

积分
2481
板凳
发表于 2024-5-4 18:06:39 | 只看该作者
我一直想问一下.有@嵌入式方法的子程序转c++代码后,还是否存在下判断这个方法外衣??
回复

使用道具 举报

69

主题

992

帖子

4478

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4478
沙发
 楼主| 发表于 2024-5-4 17:41:42 | 只看该作者
<火山程序 类型 = "通常" 版本 = 1 />

包 火山.程序

类 启动类 <公开 基础类 = 程序类 "">
{
    方法 启动方法 <公开 类型 = 整数 返回值注释 = "">
    {
        变量 文本变量 <类型 = 文本型 值 = "a">
        变量 整数变量 <类型 = 整数 值 = 0>
        变量 整数模板 <类型 = 模板类 @视窗.后缀文本 = "<INT>">
        调试输出(1)
        整数模板.下判断 (整数变量)
        调试输出(2)
        整数模板.下判断 (文本变量)
        调试输出(3)
        返回 (1)
    }
}

类 模板类 <公开 @视窗.前缀文本 = "template <typename TYPE>\r\nCDECL">
{

    # @ <include>
    # @ int 判断(TYPE tt){return 114514;}//它的返回值是无意义的,只要他能运行就证明正确
    # @ </include>

    方法 下判断 <公开 类型 = 逻辑型 注释 = "专业程序要敢于下判断" @嵌入式方法 = "">
    参数 参数 <@匹配类型 = 所有类型>
    {
        @ @sn<this>.判断(@<参数>)
    }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-27 10:24 , Processed in 0.098009 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表