模板特殊化(Template specialization)

本文详细解释了如何在Chromium中利用模板特殊化实现特定功能,通过实例展示了模板特殊化在处理不同数据类型时的具体应用,以及如何在类模板中进行特殊化以满足特定需求。

在chromium中实现了urple,用到了模板特殊化。base/turple.h

来自: http://hi.baidu.com/yzmforever123/item/5ce760521239219408be17a4


模板的特殊化是当模板中的pattern有确定的类型时,模板有一个具体的实现。例如假设我们的类模板pair 包含一个取模计算(module operation)的函数,而我们希望这个函数只有当对象中存储的数据为整型(int)的时候才能工作,其他时候,我们需要这个函数总是返回0。这可以通过下面的代码来实现:

// Template specialization

#include <iostream.h>

template <class T> class pair {

    T value1, value2;

public:

    pair (T first, T second){

        value1=first;

        value2=second;

    }

    T module () {return 0;}

};

template <>

class pair <int> {

    int value1, value2;

public:

    pair (int first, int second){

        value1=first;

        value2=second;

    }

    int module ();

};

template <>

int pair<int>::module() {

    return value1%value2;

}

int main () {

    pair <int> myints (100,75);

    pair <float> myfloats (100.0,75.0);

    cout << myints.module() << '\n';

    cout << myfloats.module() << '\n';

    return 0;

}

25

0

template <> class class_name <type>

这个特殊化本身也是模板定义的一部分,因此,我们必须在该定义开头写template <>。而且因为它确实为一个具体类型的特殊定义,通用数据类型在这里不能够使用,所以第一对尖括号<> 内必须为空。在类名称后面,我们必须将这个特殊化中使用的具体数据类型写在尖括号<>中。

当我们特殊化模板的一个数据类型的时候,同时还必须重新定义类的所有成员的特殊化实现(如果你仔细看上面的例子,会发现我们不得不在特殊化的定义中包含它自己的构造函数 constructor,虽然它与通用模板中的构造函数是一样的)。这样做的原因就是特殊化不会继承通用模板的任何一个成员。


在chromium的自定义消息的消息参数中用到了template specializing






参考:

http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/18/2728753.html


模板Template)是 C++ 中实现泛型编程的核心机制,它允许我们编写与数据类型无关的通用代码。通过模板,可以定义函数模板和类模板,使得同一段代码能够处理多种不同的数据类型,而无需为每种类型重复编写逻辑。 ### 1. 函数模板(Function Template) 函数模板允许我们定义一个通用的函数,编译器会根据调用时的实际参数类型自动生成对应的函数实例。 ```cpp template <typename T> T max(T a, T b) { return (a > b) ? a : b; } ``` 使用示例: ```cpp int main() { std::cout << max(3, 7) << std::endl; // T 被推导为 int std::cout << max(3.5, 2.8) << std::endl; // T 被推导为 double std::cout << max('a', 'z') << std::endl; // T 被推导为 char return 0; } ``` 也可以显式指定模板参数: ```cpp std::cout << max<double>(3, 4.5) << std::endl; ``` ### 2. 类模板(Class Template) 类模板用于定义通用类,例如标准库中的 `std::vector<T>`、`std::pair<T, U>` 等。 ```cpp template <typename T> class Stack { private: std::vector<T> elements; public: void push(const T& elem); void pop(); T top() const; bool empty() const { return elements.empty(); } }; template <typename T> void Stack<T>::push(const T& elem) { elements.push_back(elem); } template <typename T> void Stack<T>::pop() { if (elements.empty()) { throw std::out_of_range("Stack<>::pop(): empty stack"); } elements.pop_back(); } template <typename T> T Stack<T>::top() const { if (elements.empty()) { throw std::out_of_range("Stack<>::top(): empty stack"); } return elements.back(); } ``` 使用示例: ```cpp int main() { Stack<int> intStack; intStack.push(10); intStack.push(20); std::cout << intStack.top() << std::endl; // 输出 20 intStack.pop(); std::cout << intStack.top() << std::endl; // 输出 10 Stack<std::string> stringStack; stringStack.push("Hello"); stringStack.push("World"); std::cout << stringStack.top() << std::endl; // 输出 World return 0; } ``` ### 3. 模板参数类型 - `typename T` 或 `class T`:表示类型参数,两者等价。 - 非类型模板参数:允许传入常量值,如整数、指针等。 ```cpp template <typename T, int N> class Array { private: T data[N]; public: T& operator[](int index) { return data[index]; } int size() const { return N; } }; Array<int, 10> arr; // 创建一个大小为10的int数组 ``` ### 4. 模板特化(Specialization) 当需要对特定类型进行特殊处理时,可以使用模板特化。 #### 全特化(Full Specialization) ```cpp template <> class Stack<bool> { // 特殊实现,比如位压缩存储 }; ``` #### 偏特化(Partial Specialization) 仅适用于类模板,对部分模板参数进行特化。 ```cpp template <typename T> class Stack<T*> { // 专用于指针类型的栈 }; ``` ### 5. 变长模板(Variadic Templates) C++11 引入了变长模板,支持任意数量的模板参数。 ```cpp template <typename... Args> void print(Args... args) { (std::cout << ... << args) << std::endl; // C++17 折叠表达式 } print(1, "hello", 3.14); // 输出: 1hello3.14 ``` --- ### 解释: 模板的本质是在**编译期**生成具体类型的代码(称为“实例化”),因此它是静态多态的一种形式,不带来运行时开销。编译器会为每个使用的类型生成一份独立的函数或类副本。 优点: - 类型安全:相比宏或 `void*` 更安全。 - 性能高:无运行时开销。 - 复用性强:一次编写,多处使用。 缺点: - 编译时间增加:每个实例化都会生成新代码。 - 错误信息复杂:模板错误通常冗长难懂。 - 代码膨胀:多个类型可能导致目标文件变大。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值