ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

类型映射

2026/8/11 0:07:25 拓冰建站 浏览量
类型映射

用模板特化建立“类型到类型的关联”,从而让通用代码能根据“标签类型”自动适配不同的类型组合。

点击查看代码
#include <iostream>class Test1;
class Test2;//这是默认映射:对任意类型 T,都映射到 void
template <typename T>
class TypeTbl {
public:typedef void ret_type;typedef void par1_type;typedef void par2_type;
};//特定类型做了特化
template<>
class TypeTbl<Test1> {
public:typedef char ret_type;typedef int par1_type;typedef double par2_type;
};template<>
class TypeTbl<Test2> {
public:typedef short ret_type;typedef long par1_type;typedef float par2_type;
};template <typename T>
class Test {
public:typename TypeTbl<T>::ret_type compute(typename TypeTbl<T>::par1_type x,typename TypeTbl<T>::par2_type y) {return static_cast<typename TypeTbl<T>::ret_type>(x);}
};int main() {Test<Test1> t1;char result = t1.compute(65, 3.14);std::cout << "Result from Test<Test1>: " << result << std::endl; // 输出 'A'Test<Test2> t2;// 注意:100000 可能超出 short 范围!改用安全值short result2 = t2.compute(1000L, 2.718f);std::cout << "Result from Test<Test2>: " << result2 << std::endl;// system("pause"); // 移除或替换为 std::cin.get();return 0;
}
template <typename T>
class Test {
public:typename TypeTbl<T>::ret_type compute(typename TypeTbl<T>::par1_type x,typename TypeTbl<T>::par2_type y) {return static_cast<typename TypeTbl<T>::ret_type>(x);}
};

编译器在实例化 Test 时,会:

  • 1 查看TypeTbl<Test1>的特化版本;
  • 2 得到 ret_type = char, par1_type = int, par2_type = double;
  • 3 生成函数签名:char compute(int, double)

同理,Test<Test2> 会生成:short compute(long, float)
可以把 TypeTbl 想象成一个“字典”或“配置表”:

TypeTbl = {Test1: { ret: char,   par1: int,    par2: double },Test2: { ret: short,  par1: long,   par2: float  }
}