类型映射
用模板特化建立“类型到类型的关联”,从而让通用代码能根据“标签类型”自动适配不同的类型组合。
点击查看代码
#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 }
}
浙公网安备 33010602011771号