You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ArchiCAD开发能否实现任意类型的API_Neig转GS::Array模板函数

问题原因分析
  • 你当前代码的报错本质是未正确声明模板函数,代码中GS::Array<class T>里的class T属于前置声明的不完整类型,编译器在编译阶段无法确定T的内存大小、成员方法等信息,自然无法完成类型转换和GS::Array的实例化操作。
  • 你直接使用C风格强制转换把API_Neig转为T类型,没有做任何合法性校验,即便编译通过也大概率会出现未定义行为。
  • 你代码中的*p_neigs[ii]存在运算符优先级错误,[]优先级高于*,实际执行顺序是先取p_neigs[ii]再解引用,而API_Neig**作为ArchiCAD的句柄类型,只有p_neigs[0]存储了数组首地址,ii>0时会直接访问非法内存,属于隐藏运行时错误。
通用函数实现方案

可以实现符合需求的通用转换函数,但不支持处理任意类型的对象,仅支持所有可从API_Neig安全转换的目标类型,实现参考如下:

#include <type_traits>

// 首先将函数声明为模板函数
template<class T>
GS::Array<T> GetItemsFromNeig(API_Neig** p_neigs)
{
    // 静态断言提前拦截不支持的转换类型,编译阶段就抛出可理解的报错
    static_assert(std::is_convertible_v<API_Neig, T> || std::is_constructible_v<T, API_Neig>, 
                  "Target type T cannot be constructed from API_Neig");
    
    UInt32 nSel = BMGetHandleSize((GSHandle)p_neigs) / sizeof(API_Neig);
    GS::Array<T> resultArray;
    resultArray.Reserve(nSel); // 预分配空间提升性能

    for (UInt32 ii = 0; ii < nSel; ++ii) {
        // 修正索引逻辑,使用列表初始化替代不安全的C风格强制转换
        resultArray.Push(T{ (*p_neigs)[ii] });
    }

    return resultArray;
}

注:上述代码直接返回GS::Array值而非堆指针,利用GS类的移动语义避免拷贝开销,同时消除手动管理内存带来的泄漏风险。如果你有特殊场景必须返回指针,可以自行调整返回值为GS::Array<T>*,但需确保调用方完成内存释放。

使用示例

如果要转换为API_Guid类型的数组,调用方式如下:

API_Neig** selectedNeigs = /* 从ArchiCAD API获取的选中元素Neig句柄 */;
GS::Array<API_Guid> itemGuids = GetItemsFromNeig<API_Guid>(selectedNeigs);

内容的提问来源于stack exchange,提问作者Gyula Sámuel Karli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:45:06