类型映射

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

点击查看代码
#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 }
}

posted @ 2026-02-07 23:21  fangshuo  阅读(11)  评论(0)    收藏  举报