题目

编写程序,演示模板元编程的核心技术——全特化(Full Specialization)与偏特化(Partial Specialization)。设计类型信息探测器 TypeTraits<T> 与通用比较器:针对通用类型输出常规行为;对指针类型 T* 进行偏特化(解引用指针比对真实内容,而非比对指针内存物理地址大小);对 const char* 进行全特化(使用 std::strcmp 进行 C 字符串内容比对)。

输入格式:无需外部输入。

输出格式:输出普通类型、指针偏特化与 C 字符串全特化调用的对照结果。

数据范围与约定:类模板偏特化、函数全特化与针对性底层硬件/算法优化。

思路与算法

1. 偏特化的定义
保持模板部分参数开放,或者给参数施加特定约束(如限制为指针 T*、引用 T& 或特定容器 std::vector<T>)。注意:函数模板只允许全特化,不允许偏特化(通常通过函数重载代替偏特化);类模板同时支持全特化与偏特化。

2. 指针比对的深层陷阱
如果用通用模板 a < b 比对两个 const char*,实质上比对的是两个字符串常量的内存堆栈地址大小!通过特化 strcmp,才能真正实现字符串字典序比对。

3. 类型萃取的底层支撑
标准库 <type_traits>(如 std::is_pointer、std::decay)内部正是依靠模板全特化与偏特化构建起的庞大编译期类型内省体系。

完整程序

#include <iostream>
#include <cstring>

// 1. 通用主模板
template <typename T>
struct Comparator {
    static bool isEqual(const T& a, const T& b) {
        std::cout << "[主模板通用比较] ";
        return a == b;
    }
};

// 2. 指针类型偏特化 (Partial Specialization)
template <typename T>
struct Comparator<T*> {
    static bool isEqual(T* a, T* b) {
        std::cout << "[偏特化:指针解引用深度比较] ";
        if (a == b) return true;
        if (!a || !b) return false;
        return *a == *b; // 比较指针指向的具体内容
    }
};

// 3. const char* 全特化 (Full Specialization)
template <>
struct Comparator<const char*> {
    static bool isEqual(const char* a, const char* b) {
        std::cout << "[全特化:C 字符串 strcmp 字典比对] ";
        if (a == b) return true;
        if (!a || !b) return false;
        return std::strcmp(a, b) == 0;
    }
};

int main() {
    // 1. 命中主模板
    int x = 42, y = 42;
    std::cout << std::boolalpha << Comparator<int>::isEqual(x, y) << "\n\n";

    // 2. 命中指针类型偏特化
    int* px = &x;
    int other42 = 42;
    int* py = &other42; // 指向不同物理内存,但内容相同
    std::cout << "指针 px 与 py 是否同址: " << std::boolalpha << (px == py) << "\n";
    std::cout << std::boolalpha << Comparator<int*>::isEqual(px, py) << "\n\n";

    // 3. 命中 const char* 全特化
    char str1[] = "Hello";
    char str2[] = "Hello"; // 不同栈缓冲
    std::cout << std::boolalpha << Comparator<const char*>::isEqual(str1, str2) << "\n";

    return 0;
}

运行示例

输出:

[主模板通用比较] true

指针 px 与 py 是否同址: false
[偏特化:指针解引用深度比较] true

[全特化:C 字符串 strcmp 字典比对] true