递归火山软件开发平台

标题: 【已解决】当一个函数参数有时需要文本型有时需要文本... [打印本页]

作者: 沉默流星    时间: 昨天 12:12
标题: 【已解决】当一个函数参数有时需要文本型有时需要文本...
本帖最后由 沉默流星 于 2025-4-22 13:38 编辑

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


(, 下载次数: 0)

作者: hcwanz    时间: 昨天 12:21
本帖最后由 hcwanz 于 2025-4-22 12:22 编辑

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


作者: 鱼来鱼往    时间: 昨天 12:46
本帖最后由 鱼来鱼往 于 2025-4-22 12:49 编辑

好几种方法

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

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

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

作者: 沉默流星    时间: 昨天 13:02
鱼来鱼往 发表于 2025-4-22 12:46
好几种方法

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

第三种方式应该如何实现呢,能否给个例子谢谢。
作者: 沉默流星    时间: 昨天 13:04
hcwanz 发表于 2025-4-22 12:21
分成两个方法, 或在嵌入式里用typeid?
if( typeid(变量).name() == typeid(文本型).name() )
{...}

火山嵌入式方法不支持多次引用火山参数。虽然分成两个方法可以实现,但这是下下策。
作者: hcwanz    时间: 昨天 13:10
本帖最后由 hcwanz 于 2025-4-22 13:16 编辑
沉默流星 发表于 2025-4-22 13:02
第三种方式应该如何实现呢,能否给个例子谢谢。

定义两个重载的c++方法
作者: 沉默流星    时间: 昨天 13:17
hcwanz 发表于 2025-4-22 13:10
定义两个重载的c++方法

有一个函数实现的嘛
作者: hcwanz    时间: 昨天 13:22
本帖最后由 hcwanz 于 2025-4-22 13:24 编辑
沉默流星 发表于 2025-4-22 13:17
有一个函数实现的嘛

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

(, 下载次数: 0)

作者: 鱼来鱼往    时间: 昨天 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
作者: Xelloss0618    时间: 昨天 13:52
你这封装手册没看明白啊,@嵌入式方法 的属性值加上 "req_str_param_text_pointer=true" 就行了。
这时你参数传文本型,会自动用GetText() 取文本指针来传参,其他不变。
作者: 沉默流星    时间: 昨天 13:58
Xelloss0618 发表于 2025-4-22 13:52
你这封装手册没看明白啊,@嵌入式方法 的属性值加上 "req_str_param_text_pointer=true" 就行了。
这时你参 ...

嵌入式方法里的选项很少用,用的少的情况下难免有不知道的




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4