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

如何移除函数模板中与RT关联的冗余Type类型参数?

移除冗余模板参数Type的实现方案

方法一:在RT类内部定义嵌套关联类型

如果可以修改RT类的代码,最直接的方式是在RT类中嵌套定义对应的Type类型,让模板自动获取关联类型:

步骤1:给RT类添加嵌套类型

以Maritime为例,在类内部声明关联的Type:

class NM { /* 具体实现 */ };

class Maritime {
public:
    // 明确声明当前RT对应的Type类型
    using Type = NM;
    // 保持原有的构造函数
    Maritime(int val1, NM val2) { /* 构造逻辑 */ }
};

步骤2:修改make_obj模板

只保留RT作为模板参数,通过RT::Type获取关联的类型:

template<typename RT>
RT make_obj(Object obj)
{
    return RT(
        obj.value1(),
        // 直接使用RT内部定义的Type
        make_another_obj<typename RT::Type>(obj.value2())
    );
}

调用方式

调用时只需要指定RT类型,无需传入Type:

Object my_obj;
Maritime obj = make_obj<Maritime>(my_obj);

方法二:用外部traits模板映射关联关系

如果无法修改RT类的定义,可以通过外部的traits模板来建立RT和Type的映射:

步骤1:定义traits模板并特化

先声明基础的traits模板,再为每个RT类型特化,指定对应的Type:

// 基础traits模板声明
template<typename RT>
struct RTTypeTraits;

// 为Maritime特化,指定对应Type为NM
template<>
struct RTTypeTraits<Maritime> {
    using Type = NM;
};

// 示例:为其他RT类型(比如Air)特化
class KM { /* 具体实现 */ };
class Air { /* 构造逻辑 */ };
template<>
struct RTTypeTraits<Air> {
    using Type = KM;
};

步骤2:修改make_obj模板

通过RTTypeTraits<RT>::Type获取关联类型:

template<typename RT>
RT make_obj(Object obj)
{
    return RT(
        obj.value1(),
        make_another_obj<typename RTTypeTraits<RT>::Type>(obj.value2())
    );
}

调用方式

同样只需指定RT类型:

Object my_obj;
Air obj = make_obj<Air>(my_obj);

注意事项

  • 无论哪种方法,如果某个RT类型没有定义对应的关联Type,编译时会直接报错,这符合需求——因为RT和Type本来就必须有固定关联。
  • 如果RT是模板类,可以对模板类进行traits特化,比如template<typename T> struct RTTypeTraits<MyRT<T>> { using Type = MyType<T>; };。

内容的提问来源于stack exchange,提问作者LarsA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:52:56