C++笔记 - 模板特化

341 阅读1分钟

在C++中可以通过模板编程来实现代码复用,减少因为类型不同相似的代码。模板代码一般放在头文件中,因为编译器需要在编译时能通过模板代码,生成最终的C++代码。下面看一个模板实例代码:

#include <iostream>

// 函数模板
template <typename T> void show(T t1, T t2) {
    std::cout << "函数模板" << std::endl;
}

// 函数模板全特化
template <> void show(const char *t1, const char *t2) {
    std::cout << "函数模板全特化" << std::endl;
}

// C++不支持函数模板偏特化,可以重载解决
// template<typename T> bool show<T, int>(T a, double b);

// 函数重载
template <typename T> void show(T a, double b) {
    std::cout << "函数重载" << std::endl;
}

// 类模板
template <typename T, typename U> class Any {
  public:
    Any(T t, U u) { std::cout << "类模板" << std::endl; }
};

// 类模板全特化
template <> class Any<const char *, const char *> {
  public:
    Any(const char *t, const char *u) {
        std::cout << "类模板全特化" << std::endl;
    }
};

// 类模板偏特化
template <typename T, typename U> class Any<T *, const U *> {
  public:
    Any(T *t, const U *u) { std::cout << "类模板偏特化" << std::endl; }

  private:
    T m_t;
    U m_u;
};

int main(void) {
    show(1, 2);   // 函数模板
    show(1, 2.1); // 函数重载
    /* show(1.1, 2.1); // 出错 */
    show("hello", "world"); // 函数模板全特化

    Any<int, double> a(1, 2.0f); // 类模板
    Any<const char *, const char *> b("hello", " world");      // 类模板全特化
    Any<char *, const char *> c(const_cast<char *>("hello"), " world"); //类模板偏特化
}