`

局部特化

阅读更多
局部特化并不会引入一个新的模板,它只对原来模板(基本模板)进行扩展。当查找类模板的时候,刚开始只会考虑基本模板。然而,如果在选择了基本模板之后,还发现了一个”模板实参能够和实例化体的模板实参进行完全模式匹配“的局部特化,那么将会实例化该局部特化的定义,而不再实例化基本模板的定义。
#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++模板编程中只特化模板类的一个成员函数

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

    C++必知必会【可搜索+可编辑/复制/粘贴+无密码】

    一、下载须知 .........................本书用于传播和交流思想 .........................无目录 ................................................................................................................

    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 声明和...

    C++ Primer第四版【中文高清扫描版】.pdf

    16.6.3 特化成员而不特化类 569 16.6.4 类模板的部分特化 570 16.7 重载与函数模板 570 小结 573 术语 574 第五部分 高级主题 第17章 用于大型程序的工具 579 17.1 异常处理 580 17.1.1 抛出类类型的异常 581 ...

    flux-demo:使用flux和webpack创建一个react演示

    使用react-router拆分了common公用库和layout布局库尝试添加less文件添加了loader公共模块##目标结构化react编程可扩展性整体依据功能划分,局部按照业务逻辑划分##说明dispatcher:Dispatcher 本质上就是一个事件...

    C++代码设计与重用

    4.3.3 模板特化大小 4.4 运行时间 4.4.1 内联(inlning) 4.4.2 虚函数 4.4.3 返回引用 4.5 空闲存储空间(free-store)和堆栈空间(stack space) 4.5.1 使用高效的算法 4.5.2 尽可能快地释放空闲资源 ...

    C++智能指针的原理和实现.pdf

    // 对类型void特化 成员函数: (1) : 获得内部对象的指针; (2) :释放被管理对象的所有权,将内部指针置为空,返回内部对象的指针,此指针需要⼿动释放; (3) :销毁内部对象并接受新的对象的所有权; (4) :从...

    C++ STL 开发技术导引(第6章)

    2.3 模板完全特化 28 2.4 函数模板重载 30 2.5 类模板继承 30 2.6 本章小结 31 第3章 C++ I/O流技术 32 3.1 I/O流类 32 3.2 标准输入输出 34 3.3 文件输入输出 36 3.4 流的格式控制 41 3.5 本章...

    C++ STL开发技术导引(第5章)

    2.3 模板完全特化 28 2.4 函数模板重载 30 2.5 类模板继承 30 2.6 本章小结 31 第3章 C++ I/O流技术 32 3.1 I/O流类 32 3.2 标准输入输出 34 3.3 文件输入输出 36 3.4 流的格式控制 41 3.5 本章...

    C++ STL开发技术导引(第3章)

    2.3 模板完全特化 28 2.4 函数模板重载 30 2.5 类模板继承 30 2.6 本章小结 31 第3章 C++ I/O流技术 32 3.1 I/O流类 32 3.2 标准输入输出 34 3.3 文件输入输出 36 3.4 流的格式控制 41 3.5 本章...

Global site tag (gtag.js) - Google Analytics