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

简介:

模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现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 };
复制代码
复制代码

 

本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/6581477.html,如需转载请自行联系原作者
相关文章
|
2天前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
5天前
|
编译器 C++
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
|
5天前
|
存储 机器学习/深度学习 编译器
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
|
2天前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
2天前
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
|
3月前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
117 4
|
5天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
2天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
2天前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
2天前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。