递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[其它] 【已解决】当一个函数参数有时需要文本型有时需要文本...

[复制链接]

230

主题

1722

帖子

7106

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
7106
QQ
跳转到指定楼层
楼主
发表于 昨天 12:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 沉默流星 于 2025-4-22 13:38 编辑

问题如下:当传入参数是文本型或者文本指针时,虽然可以使用@匹配类型来匹配。
但当参数类型为 文本型时,需要参数名.GetText()时又该如何整。



火山视窗封装视频教程
回复

使用道具 举报

75

主题

1134

帖子

5130

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5130
沙发
发表于 昨天 12:21 | 只看该作者
本帖最后由 hcwanz 于 2025-4-22 12:22 编辑

分成两个方法, 或在嵌入式里用typeid?
if( typeid(变量).name() == typeid(文本型).name() )
{...}
else
{...}

回复

使用道具 举报

0

主题

2

帖子

50

积分

注册会员

Rank: 2

积分
50
板凳
发表于 昨天 12:46 | 只看该作者
本帖最后由 鱼来鱼往 于 2025-4-22 12:49 编辑

好几种方法

一是使用typeid得到的类型名字符串来判断,但是typeid得到的类型名字符串在不同编译器下是不一样的,而且字符串比较是运行时的,会有性能开销,不推荐

二是使用if constexpr,搭配类型萃取,也可以实现,而且没有运行时开销,编译后不存在分支判断,但是if constexpr要求C++17,火山用户普遍用自带的C++14,还有些库很老,开17或许会导致某些库编译不通过,这种方法最好,但是在火山可能存在兼容性问题

三是用嵌入式方法里的参数,全部作为实参去调用另一个嵌入的C++函数,火山函数虽然不支持重载,但是C++支持,嵌入两个C++函数的重载版本,一个接收火山的文本型,一个接收字符串指针,借助C++编译器实现重载,这种方法也没有性能开销,在火山没有兼容性问题,就是要多写些代码
回复

使用道具 举报

230

主题

1722

帖子

7106

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
7106
QQ
地板
 楼主| 发表于 昨天 13:02 | 只看该作者
鱼来鱼往 发表于 2025-4-22 12:46
好几种方法

一是使用typeid得到的类型名字符串来判断,但是typeid得到的类型名字符串在不同编译器下是不一 ...

第三种方式应该如何实现呢,能否给个例子谢谢。
火山视窗封装视频教程
回复

使用道具 举报

230

主题

1722

帖子

7106

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
7106
QQ
5#
 楼主| 发表于 昨天 13:04 | 只看该作者
hcwanz 发表于 2025-4-22 12:21
分成两个方法, 或在嵌入式里用typeid?
if( typeid(变量).name() == typeid(文本型).name() )
{...}

火山嵌入式方法不支持多次引用火山参数。虽然分成两个方法可以实现,但这是下下策。
火山视窗封装视频教程
回复

使用道具 举报

75

主题

1134

帖子

5130

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5130
6#
发表于 昨天 13:10 | 只看该作者
本帖最后由 hcwanz 于 2025-4-22 13:16 编辑
沉默流星 发表于 2025-4-22 13:02
第三种方式应该如何实现呢,能否给个例子谢谢。

定义两个重载的c++方法
回复

使用道具 举报

230

主题

1722

帖子

7106

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
7106
QQ
7#
 楼主| 发表于 昨天 13:17 | 只看该作者
hcwanz 发表于 2025-4-22 13:10
定义两个重载的c++方法

有一个函数实现的嘛
火山视窗封装视频教程
回复

使用道具 举报

75

主题

1134

帖子

5130

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5130
8#
发表于 昨天 13:22 | 只看该作者
本帖最后由 hcwanz 于 2025-4-22 13:24 编辑
沉默流星 发表于 2025-4-22 13:17
有一个函数实现的嘛

非要说的话直接不用`嵌入式方法`就行了, 现代c++编译器拥有自己推导是`函数调用`还是`函数替换`的权力, 所以不用嵌入式方法速度也不会慢.


回复

使用道具 举报

0

主题

2

帖子

50

积分

注册会员

Rank: 2

积分
50
9#
发表于 昨天 13:35 | 只看该作者
本帖最后由 鱼来鱼往 于 2025-4-22 13:46 编辑
沉默流星 发表于 2025-4-22 13:02
第三种方式应该如何实现呢,能否给个例子谢谢。

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

包 火山.程序

类 启动类 <公开 基础类 = 程序类>
{

    # @begin
    # <> <include>
    #
    # @dt<整数> 火山方法(const wchar_t* 文本)
    # {
    #     MessageBoxW(nullptr, 文本, 文本, 0);
    #      return 0;
    # }
    #
    # @dt<整数> 火山方法(const @dt<文本型>& 文本)
    # {
    #      return 火山方法(文本.GetText());
    # }
    #
    # <> </include>
    # @end
    #

    方法 启动方法 <公开 类型 = 整数>
    {
        // 在此处填入自己的代码
        变量 文本 <类型 = 文本型>
        变量 字符串指针 <类型 = 文本指针>
        文本 = "文本"
        @ @<字符串指针> = L"字符串指针";

        火山方法 (文本)
        火山方法 (字符串指针)

        返回 (1)

    }

    方法 火山方法 <静态 类型 = 整数 @嵌入式方法 = "">
    参数 欲操作的对象 <类型 = 启动类>
    参数 符号名称 <@匹配类型 = 通用型>
    {
        @ @<欲操作的对象>.火山方法(@<符号名称>);
    }
}

C:\Users\HCZ\Desktop\Snipaste_2025-04-22_13-10-23.jpg
回复

使用道具 举报

28

主题

2194

帖子

7940

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
7940
10#
发表于 昨天 13:52 | 只看该作者
你这封装手册没看明白啊,@嵌入式方法 的属性值加上 "req_str_param_text_pointer=true" 就行了。
这时你参数传文本型,会自动用GetText() 取文本指针来传参,其他不变。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 18:44 , Processed in 0.097810 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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