C++ 模板特化

在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, double>(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"); //类模板偏特化
}

如果觉得有帮助,可以扫描右边的微信打赏码支持一下.

Leave a Reply

Your email address will not be published. Required fields are marked *