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

转自:https://www.cnblogs.com/zhoug2020/p/6581477.html

模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1、2个成员函数即可。在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护。

例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化:

 1 template <typename _Ty>
 2 struct A
 3 {
 4     // 其他成员函数a
 5     // 其他成员函数b
 6     // ......
 7     void func()
 8     {
 9         std::cout << "common type." << std::endl;
10     }
11 };
12
13 int main()
14 {
15     A<int> i;
16     i.func();
17
18     A<char*> c;
19     c.func();
20
21     return 0;
22 }

方法一:通过运行时类型识别,这个方法最简单

 1 template <typename _Ty>
 2 struct A
 3 {
 4     // 其他成员函数a
 5     // 其他成员函数b
 6     // ......
 7     void func()
 8     {
 9         if (typeid(_Ty) == typeid(char*))
10             std::cout << "common type." << std::endl;
11         else
12             std::cout << "special type." << std::endl;
13     }
14 };

方法二:通过类的成员函数模板特化来实现,这个方法也比较简单

 1 template <typename _Ty>
 2 struct A
 3 {
 4     // 其他成员函数a
 5     // 其他成员函数b
 6     // ......
 7     template <typename __Ty>
 8     void funcImpl()
 9     {
10         std::cout << "common type." << std::endl;
11     }
12
13     template <>
14     void funcImpl<char*>()
15     {
16         std::cout << "special type." << std::endl;
17     }
18
19     void func()
20     {
21         funcImpl<_Ty>();
22     }
23 };

方法三:通过一个嵌套模板类的特化来实现

 1 template <typename _Ty>
 2 struct A
 3 {
 4     // 其他成员函数a
 5     // 其他成员函数b
 6     // ......
 7     template <typename __Ty>
 8     struct IsCharPType
 9     {
10         const static bool b = false;
11     };
12
13     template<>
14     struct IsCharPType<char*>
15     {
16         const static bool b = true;
17     };
18
19     void func()
20     {
21         if (IsCharPType<_Ty>::b)
22             std::cout << "special type." << std::endl;
23         else
24             std::cout << "common type." << std::endl;
25     }
26 };

方法四:先定义一个嵌套的类模板,通过重载函数实现(函数的参数类型不同

 1 template <typename _Ty>
 2 struct A
 3 {
 4     // 其他成员函数a
 5     // 其他成员函数b
 6     // ......
 7     template <typename __Ty>
 8     struct TypeClass
 9     {
10     };
11
12     template <typename __Ty>
13     void funcImpl(const TypeClass<__Ty>&)
14     {
15         std::cout << "common type." << std::endl;
16     }
17
18     void funcImpl(const TypeClass<char*>&)
19     {
20         std::cout << "special type." << std::endl;
21     }
22
23     void func()
24     {
25         funcImpl(TypeClass<_Ty>());
26     }
27 };

原文地址:https://www.cnblogs.com/dongzhiquan/p/cpp_template_class_specify_one_function.html

时间: 2024-10-10 17:20:57

C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)的相关文章

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

模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护. 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 template <typename _Ty> 2 struct A 3 { 4 // 其他成员函数a 5 //

C++ 11可变参数接口设计在模板编程中应用的一点点总结

概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量(或属性,C#中属性和成员变量还是有区别的): 类的成员方法: 从编译器的角度看,我们必须明确指定以上3部分,才算完整地定义了一个类并且编译通过. 所谓的“类弱化”,是指类的设计者在定义类的时候,并没有完整定义一个类,而是把类的其中一部分的定义留给类的使用者. 从传统才c++98看,通过模板类,使用

模板编程中的几点问题

类模板中头文件和源文件分离的编译问题 1.在泛型编程时, 声明和实现要放置在一起 (因为某些编译器不支持分离) 2.非泛型编程 声明和实现分开 可以为模板指定默认类型 template<typename T=int> class Stack{ } Stack<> stack;//Stack<int> stack; //stack is a stack for int 模板中放置非类型参数 template<typename T, int capacity>

java并发编程中常用的工具类 Executor

/***************************************************  * TODO: description .  * @author: gao_chun  * @since:  2015-4-17  * @version: 1.0.0  * @remark: 转载请注明出处  **************************************************/ java.util.concurrent.Executor 使用 Execut

模板编程中的技巧

关键字 typename 在C++标准化过程中,引入关键字typename是为了说明:模板内部的标识符可以是一个类型.譬如下面的例子: template<typename T> class MyClass{ typename T::SubType *ptr; ... }; 上面的程序中,第2个typename被用来说明:SubType是定义与类T内部的一种类型.因此,ptr是一个指向T::SubType类型的指针. 如果不使用typename,SubType就会被认为是一个静态成员,那么它应该

C++模板编程 - 第六章 模板实战

关于源代码的组织:函数模板在实例化的时候编译器要能够看到其定义——这一点是要注意的. 包含模型 将模板的声明和定义都放到头文件中,不过这样带来的问题是增加了include的开销. 显示实例化 感觉这个东东比较鸡肋. 分离模型 export关键字 使用export关键字之后即使模板的声明和定义在不同的编译单元中,模板也可以正常使用.不过,就像作者所说的,这个关键字支持还不多,坑也不少T_T

C++模板编程 - 第七章 模板术语

Template Class or Class Template Class template is a TEMPLATE used to generate classes. Template class is a classed generated from a template. Sometimes people also used it as the synonym of class template. Instantiation and Specialization Instantiat

C++模板编程 - 第八章 深入模板基础

Member function templates CANNOT be virtual! On the contrary odinary member function templates can be virtual. Linkage of Templates 1 // default 2 extern "C++" tempalte<typename T> void normal(); 3 4 // no - templates cannot have C linkage

[工作中的设计模式]模板模式

一.模式解析 准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意 模板模式的关键点为: 1.有一个父类,将整体业务逻辑和公用方法进行封装: 2.父类将具体的有差异的业务定义为抽象方法: 3.子类继承父类后,实现这些抽象方法,完成对自己业务流程的: 4.子类不可以改变父类的整体业务逻辑流程: 5.子类也可以覆盖父类中其他方法,实现定制化业务