`

局部特化

阅读更多
局部特化并不会引入一个新的模板,它只对原来模板(基本模板)进行扩展。当查找类模板的时候,刚开始只会考虑基本模板。然而,如果在选择了基本模板之后,还发现了一个”模板实参能够和实例化体的模板实参进行完全模式匹配“的局部特化,那么将会实例化该局部特化的定义,而不再实例化基本模板的定义。
#include<iostream>
using namespace std;
//基本模板
template<typename T>
class A{
public:
    void f1(){
        cout << "A::f1()" << endl;
    }
    void f2(){
        cout << "A::f2()" << endl;
    }
};

//先全局特化一个void*,防止a处的代码无限递归
template<>
class A<void*>{
public:
    void f1(){
        cout << "A::f1()" << endl;
    };
    void f2(){
        cout << "A::f2()" << endl;
    };
};

//局部特化
template<typename T>
class A<T*>{
private:
    A<void*> impl;//a
public:
    void f1(){
        impl.f1();
    }
    void f2(){
        cout << "A<T*>::f2()"<<endl;
    }
};

int main()
{
    A<int*> a;
    a.f1();
    a.f2();
}

A::f1()
A<T*>::f2()


函数模板只能被重载,重载的函数模板是一个分开的模板,它们之间是完全独立的。
#include<iostream>
using namespace std;
template<typename T>
T const& myMin(T const& t1,T const& t2){
    return t1>t2?t1:t2;
}

template<typename T>
T* const& myMin(T* const& t1,T* const& t2){
    return *t1>*t2?t1:t2;
}

int main(){
    int a=1,b=2;
    cout << *myMin(&a,&b);//call T* const& myMin
}

2

分享到:
评论

相关推荐

    解读C++编程中类模板的三种特化

    然而,需要注意的是,C++并不支持函数模板的局部特化,只支持类模板的局部特化。例如,在处理不同类型的指针时,如果不想为每种指针类型创建一个完全特化版本,可以使用局部特化来简化工作。 3. 模板的成员特化 ...

    C++STL模板学习讲义

    编译模型描述了模板代码如何被编译和实例化,而局部特化允许在模板中对某个特化的类型或者类型组合进行特定定义。 最后,非类型参数和缺省参数是模板参数的两种特殊形式。非类型参数允许模板接受非类型的值,比如...

    C++模板编程中只特化模板类的一个成员函数

    模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1、2个成员函数即可。在这种情况下,如果全部...

    C++ STL分析

    - **局部特化**:有时我们只需要特化类模板的一部分成员,而不是整个类,这种情况就可以使用局部特化。 ##### 缺省参数与非类型参数 除了类型参数外,模板还可以支持缺省参数和非类型参数。缺省参数允许在没有显式...

    c++Stl讲义简练版

    - **局部特化**:也可以仅为类模板的部分成员提供特化实现。 #### 七、语法公式 - **函数模板**: - 通用版本: ```cpp template void function_name(T arg) {} ``` - 特化版本: ```cpp template void ...

    C STL程序员开发指南

    - 局部特化:当只需要对部分类型进行特殊处理时使用。 - 完全特化:为特定类型的组合提供完全不同的实现。 ```cpp template struct MyPair, std::enable_if_t&lt;std::is_integral&lt;T&gt;::value&gt;&gt; { T first; T ...

    C++.Templates (中文版)

    由于C++模板的灵活性和复杂性,即使是经验丰富的程序员也可能会对模板的某些高级特性,例如特化、局部特化、实例化以及重载解析等编译器实现细节缺乏深入了解。这不仅影响了他们对自己编写的模板代码的理解,也限制...

    植物学复习二-5页.pdf

    27. **分泌腔的类型**:溶生式分泌腔是细胞解体后形成的,裂生式分泌腔是细胞壁局部特化加厚形成的。 28. **晶体的鉴别**:草酸钙晶体不溶于稀醋酸,遇稀盐酸溶解无气泡;碳酸钙晶体遇醋酸或盐酸溶解并产生气泡。 ...

    Optimizing radial basis function neural network based on rough sets and affinity propagation clustering algorithm

    径向基函数神经网络(RBFNN)是一种前馈神经网络,因其简单的网络结构、良好的逼近和正则化能力、以及优秀的局部特化和全局泛化能力而广泛受到关注。RBFNN已被证明能够近似任意合理的函数。然而,RBFNN的性能在很大...

    Effective C++ & More Effective C++.7z

    5. **C++98新特性**:涵盖了C++98标准新增的特性,如异常规格、局部静态对象和命名空间别名等,以及如何利用它们改进代码。 通过阅读这两本书,读者可以掌握C++的关键概念,理解其底层机制,从而编写出更高效、更具...

    c++经典面试题搜索

    - **模板特化:** 当需要为特定类型提供定制实现时,可以使用模板特化。 7. **异常处理:** - **try-catch机制:** 如何捕获并处理运行时错误,确保程序的健壮性。 - **throw与noexcept:** 控制异常的抛出和...

    C++和面向对象数值计算

    2.1.1 局部变量和全局变量 2.1.2 外部变量和寄存器变量 2.2 表达式 2.2.1 算术表达式 .2.2.2 关系表达式 2.2.3 逻辑表达式 2.2.4 位运算表达式 2.2.5 逗号表达式 2.3 语句 2.3.1 声明和...

    细胞生物学问答题.doc

    LDL颗粒在循环系统中与细胞膜上的LDL受体结合后,膜局部区域会内陷形成有被小窝。随后,小窝封闭,形成小泡,即有被小泡,并由细胞内吞入细胞质内。在溶酶体的酸性环境下,LDL与受体解离,胆固醇被释放出来供细胞...

    Effective_C++_第3版中文版

    - 了解局部变量、全局变量和静态局部变量的作用域和生存期,避免未定义行为。 - 恰当地使用RAII(Resource Acquisition Is Initialization)原则,让资源管理与对象生命周期同步。 5. **模板和泛型编程** - 学习...

    华为C/C++面试题

    - 内存分配:静态内存(全局变量和静态局部变量)、栈内存(函数调用时的局部变量)和堆内存(malloc/calloc/free/new/delete)的使用和理解。 - 内存泄漏检测和避免。 - 理解指针和引用,包括指针运算、指针作为...

    VC++深入详解code(CHAP13-CHAP16)

    还会讨论异常的安全性、异常传播和异常的非局部跳转,这些都是编写健壮程序的关键技能。 **第十六章:内存管理与高级话题** 在这一章中,读者将学习到C++中的动态内存分配,包括new和delete操作符的使用,内存泄漏...

    C、C++标准 pdf

    6. **局部静态对象初始化**:规定了局部静态对象的线程安全初始化,解决了多线程环境下的并发问题。 7. **部分模板特化**:允许对模板进行部分特化,提供了更多的设计灵活性。 8. **迭代器的增强**:增加了更多...

    一些c++面试题里面有些讲解非常经典

    - **模板特化**:如何为特定类型提供定制的实现。 - **模板元编程**:在编译时进行计算和类型操作,如`std::enable_if`和`std::integral_constant`。 3. **STL(标准模板库)**: - **容器**:如vector、list、...

Global site tag (gtag.js) - Google Analytics