如何移除函数模板中与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
相关产品推荐
相关产品推荐

