`

模板的特化

 
阅读更多

#include <stdio.h>
#include <string.h>

    
    //1. 这里我们先声明了一个通用类型的模板类。这里要有类型参数必须包含hashCode()方法。
    //否则,该类型在编译期实例化时将会导致编译失败。
    template <typename T>
    class CalcHashClass { //该类为标准模板类(等同于多态中的接口)
    public:
        CalcHashClass(T const& v) : _value(v) {
        }
        int hashCode() {
            printf("This is 'template <typename T> class CalcHashClass'.\n");
            return _value.hashCode() + 10000;
        }
    private:
        T _value;
    };
    
    //2. int类型实例化特化模板类。
    template <>
    class CalcHashClass<int> {
    public:
        CalcHashClass(int const& v) : _value(v) {
        }
        int hashCode() {
            printf("This is 'template <> class CalcHashClass<int>'.\n");
            return _value * 101;
        }
    private:
        int _value;
    };
    
    //3. const char*类型实例化的特化模板类
    template<>
    class CalcHashClass<const char*> {
    public:
        CalcHashClass(const char* v) {
            _v = new char[strlen(v) + 1];
            strcpy(_v,v);
        }
        ~CalcHashClass() {
            delete [] _v;
        }
        int hashCode() {
            printf("This is 'template <> class CalcHashClass<const char*>'.\n");
            int len = strlen(_v);
            int code = 0;
            for (int i = 0; i < len; ++i)
                code += (int)_v[i];
            return code;
        }
    
    private:
        char* _v;
    };
    
    //4. 辅助函数,用于帮助调用者通过函数的参数类型自动进行类型推演,以让编译器决定该
    //实例化哪个模板类。这样就可以使调用者不必在显示指定模板类的类型了。这一点和多态有
    //点儿类似。
    template<typename T>
    inline int CalcHashCode(T v) {
        CalcHashClass<T> t(v);
        return t.hashCode();
    }
    
    //5. 给出一个范例类,该类必须包含hashCode方法,否则将造成编译错误。
    class TestClass {
    public:
        TestClass(const char* v) {
            _v = new char[strlen(v) + 1];
            strcpy(_v,v);
        }
        ~TestClass() {
            delete [] _v;
        }
    public:
        int hashCode() {
            int len = strlen(_v);
            int code = 0;
            for (int i = 0; i < len; ++i)
                code += (int)_v[i];
            return code;
        }
    private:
        char* _v;
    };
    
    int main() {
        TestClass tc("Hello");
        CalcHashClass<TestClass> t1(tc);
        printf("The hashcode is %d.\n",t1.hashCode());
        //这里由于为模板类TestClass提供了基于int类型的模板特化类,因此编译器会自动选择
        //更为特化的模板类作为t2的目标类。
        CalcHashClass<int> t2(10);
        printf("The hashcode is %d.\n",t2.hashCode());
    
        //在上面的示例中,我们通过显示的给出类型信息以实例化不同的模板类,这是因为模板类
        //的类型信息是无法像模板函数那样可以通过函数参数进行推演的,为了弥补这一缺失,我们可以
        //通过一个额外的模板函数来帮助我们完成这一功能。事实上,这一技巧在Thinking in Java中
        //也同样给出了。
        printf("Ths hashcode is %d.\n",CalcHashCode(10));
        printf("Ths hashcode is %d.\n",CalcHashCode("Hello"));
        return 0;
    }
    //This is 'template <typename T> class CalcHashClass'.
    //The hashcode is 10500.
    //This is 'template <> class CalcHashClass<int>'.
    //The hashcode is 1010.
    //This is 'template <> class CalcHashClass<int>'.
    //Ths hashcode is 1010.
    //This is 'template <> class CalcHashClass<const char*>'.
    //Ths hashcode is 500.

分享到:
评论

相关推荐

    C++模板特化匹配规则

    C++模板特化匹配规则 C++模板特化匹配规则是指在C++编程语言中,模板的特化过程中,编译器如何选择最合适的模板实例化的规则。这个规则是由C++标准所定义的,目的是为了确保编译器能够正确地选择模板实例化,以便...

    深入分析C++模板特化与偏特化

    模板特化包括函数模板特化和类模板特化。 - **函数模板特化**:例如,`Max` 函数模板可以处理各种类型的数值比较,但处理字符串时需要比较字符串内容而不是地址。通过函数模板特化,可以为`const char*`类型定义一...

    C++ 类模板、函数模板全特化、偏特化的使用

    但在某些情况下,例如需要为特定类型提供不同的实现逻辑时,函数模板特化就派上用场了。在 `TC` 类模板的示例中,`funtest()` 函数的全特化版针对 `double, double` 参数进行了定制: ```cpp template void TC, ...

    C++模版特化

    ### C++模板特化概述与详解 在C++编程语言中,模板特化是一种非常重要的机制,它允许程序员为特定类型的模板提供定制化的实现。本文将深入探讨C++中的类模板特化,尤其是针对单个模板参数的不同特化类型:特化为...

    C++模板编程详解:模板函数、类、特化与SFINAE

    内容概要:本文详细介绍了C++中的模板编程技术,包括模板函数、模板类、模板特化、类型推导、SFINAE(Substitution Failure Is Not An Error)以及模板元编程等内容。通过具体的示例代码,帮助读者理解如何编写与...

    C++模板之特化与偏特化详解

    对于C++模板特化和偏特化,对于别人来说,已经不是什么新东西了,但是对于我来说,的确是我的盲区,那天在群里讨论这个问题,自己对于这部分确实没有掌握,又联想到在《STL源码剖析》一书中,对于此也是有着介绍。...

    C++中有关模板的试题题型练习题

    C++中有关模板的试题题型练习题是C++模板类型题型的综合应用,涵盖了函数模板、类模板的设计方法和实现。下面对标题、描述、标签和部分内容进行详细的解释和分析。 一、函数模板设计 函数模板是C++模板技术的核心...

    C++模板与泛型编程详解及实战应用

    主要内容包括模板的概念与优势、函数模板和类模板的声明与实例化、模板元编程、SFINAE原则、模板特化与偏特化、类型推导与auto关键字、模板与递归、模板与多态、类型列表与元组、模板参数包、模板与智能指针、模板与...

    C++模板与泛型编程入门教程:代码重用与类型安全

    内容概要:本文详细介绍了C++模板与泛型编程的基础和进阶知识,包括模板的概念与优势、函数模板和类模板的声明与实例化、模板元编程、SFINAE原则、模板特化与偏特化、类型推导与auto关键字、模板与递归、高级模板...

    数组特化模板类

    ### 数组特化模板类详解 #### 一、引言 在C++编程语言中,模板是一种非常强大的特性,它允许我们编写通用的代码来处理不同类型的数据。然而,在某些情况下,我们可能希望针对特定的数据类型或者数据结构进行优化。...

    VC++6.0模板库手册

    模板偏特化是一种特殊的模板特化形式,仅对模板的一部分进行特化。这在处理模板类的成员函数或模板模板参数时非常有用。偏特化可以更加精确地控制模板在特定情况下的行为。 **五、模板元编程** 模板元编程是一种在...

    深入学习与实践C++模板编程 值得学习

    模板特化是为某个特定类型提供定制的实现,而偏特化则是为一类类型(不是单个类型)提供定制实现。 ```cpp // 函数模板特化 template void swap(int& a, int& b) { // 特化后的交换实现 } // 类模板偏特化 ...

    程序员面试精选.pdf,这是一份不错的文件

    模板特化分为函数模板特化和类模板特化。 - 函数模板特化:当需要对模板函数对特定类型的行为进行定制时使用。例如,在`IsEqual`函数模板的例子中,原始模板无法正确处理`char*`类型的比较,因为它只是简单地比较...

    《 C++模板》和《C++模板元编程》两本

    在《C++ Templates》这本书中,读者可以深入理解模板的基本概念,如模板声明、实例化、模板特化以及模板偏特化。书中可能涵盖了模板参数推断、模板元编程的入门知识,以及如何利用模板来实现泛型算法,如排序、查找...

    C++模板中文 PDF 版 不错的c++模板书籍

    4. **模板特化与偏特化**:介绍如何对模板进行特化以处理特定类型,以及什么是偏特化,用于针对部分模板参数进行特化。 5. **模板元编程**:模板元编程是一种在编译时进行计算的技术,它是C++模板功能的一个重要...

    解决C++模板不能通过

    - **模板特化**:如果没有正确地为特定类型进行模板特化,可能会导致编译失败。 - **依赖类型推断**:模板参数的类型依赖于其他模板参数,如果推断不正确,可能导致错误。 - **显式模板实例化**:在某些情况下,...

    程序员常见面试题(算法数据结构)

    有两种类型的模板特化:函数模板特化和类模板特化。 1. 函数模板特化:当标准模板不能满足特定类型的需求时,可以为这些类型定义特化的版本。例如,在比较字符串时,原始的`IsEqual`模板函数只能比较值,对于`char*...

Global site tag (gtag.js) - Google Analytics