沉默流星 发表于 2025-4-22 12:12:46

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

本帖最后由 沉默流星 于 2025-4-22 13:38 编辑

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



hcwanz 发表于 2025-4-22 12:21:38

本帖最后由 hcwanz 于 2025-4-22 12:22 编辑

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

鱼来鱼往 发表于 2025-4-22 12:46:24

本帖最后由 鱼来鱼往 于 2025-4-22 12:49 编辑

好几种方法

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

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

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

沉默流星 发表于 2025-4-22 13:02:05

鱼来鱼往 发表于 2025-4-22 12:46
好几种方法

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

第三种方式应该如何实现呢,能否给个例子谢谢。

沉默流星 发表于 2025-4-22 13:04:43

hcwanz 发表于 2025-4-22 12:21
分成两个方法, 或在嵌入式里用typeid?
if( typeid(变量).name() == typeid(文本型).name() )
{...}


火山嵌入式方法不支持多次引用火山参数。虽然分成两个方法可以实现,但这是下下策。

hcwanz 发表于 2025-4-22 13:10:57

本帖最后由 hcwanz 于 2025-4-22 13:16 编辑

沉默流星 发表于 2025-4-22 13:02
第三种方式应该如何实现呢,能否给个例子谢谢。
定义两个重载的c++方法

沉默流星 发表于 2025-4-22 13:17:56

hcwanz 发表于 2025-4-22 13:10
定义两个重载的c++方法

有一个函数实现的嘛

hcwanz 发表于 2025-4-22 13:22:25

本帖最后由 hcwanz 于 2025-4-22 13:24 编辑

沉默流星 发表于 2025-4-22 13:17
有一个函数实现的嘛
非要说的话直接不用`嵌入式方法`就行了, 现代c++编译器拥有自己推导是`函数调用`还是`函数替换`的权力, 所以不用嵌入式方法速度也不会慢.


鱼来鱼往 发表于 2025-4-22 13:35:46

本帖最后由 鱼来鱼往 于 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 发表于 2025-4-22 13:52:32

你这封装手册没看明白啊,@嵌入式方法 的属性值加上 "req_str_param_text_pointer=true" 就行了。
这时你参数传文本型,会自动用GetText() 取文本指针来传参,其他不变。
页: [1] 2
查看完整版本: 【已解决】当一个函数参数有时需要文本型有时需要文本...