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

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

 template <typename _Ty>
struct A
{
// 其他成员函数a
// 其他成员函数b
// ......
void func()
{
std::cout << "common type." << std::endl;
}
}; int main()
{
A<int> i;
i.func(); A<char*> c;
c.func(); return ;
}

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

 template <typename _Ty>
struct A
{
// 其他成员函数a
// 其他成员函数b
// ......
void func()
{
if (typeid(_Ty) == typeid(char*))
std::cout << "common type." << std::endl;
else
std::cout << "special type." << std::endl;
}
};

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

 template <typename _Ty>
struct A
{
// 其他成员函数a
// 其他成员函数b
// ......
template <typename __Ty>
void funcImpl()
{
std::cout << "common type." << std::endl;
} template <>
void funcImpl<char*>()
{
std::cout << "special type." << std::endl;
} void func()
{
funcImpl<_Ty>();
}
};

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

 template <typename _Ty>
struct A
{
// 其他成员函数a
// 其他成员函数b
// ......
template <typename __Ty>
struct IsCharPType
{
const static bool b = false;
}; template<>
struct IsCharPType<char*>
{
const static bool b = true;
}; void func()
{
if (IsCharPType<_Ty>::b)
std::cout << "special type." << std::endl;
else
std::cout << "common type." << std::endl;
}
};

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

 template <typename _Ty>
struct A
{
// 其他成员函数a
// 其他成员函数b
// ......
template <typename __Ty>
struct TypeClass
{
}; template <typename __Ty>
void funcImpl(const TypeClass<__Ty>&)
{
std::cout << "common type." << std::endl;
} void funcImpl(const TypeClass<char*>&)
{
std::cout << "special type." << std::endl;
} void func()
{
funcImpl(TypeClass<_Ty>());
}
};

C++模板编程中只特化模板类的一个成员函数的更多相关文章

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

    转自:https://www.cnblogs.com/zhoug2020/p/6581477.html 模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多 ...

  2. CDocument类的UpdateAllViews()成员函数

    (一)UpdateAllViews() 与 Invalidate()的区别 UpdateAllViews()是在DOC/VIEW结构中,当一个视图的数据改变后,通知所有视图作相应的改变,和重画毫无关系 ...

  3. 为什么通过空指针(NULL)能够正确调用类的部分成员函数

    #include <iostream> using namespace std; class B { public: void foo() { cout << "B ...

  4. 编程中易犯错误汇总:一个综合案例.md

    # 11编程中易犯错误汇总:一个综合案例 在上一篇文章中,我们学习了如何区分好的代码与坏的代码,如何写好代码.所谓光说不练假把式,在这篇文章中,我们就做一件事——一起来写代码.首先,我会先列出问题,然 ...

  5. js中使用function定义类、实例化,函数的调用方法

    function Test002(name, age){ name, age, this.printInfo = function(){ //定义的公有方法 console.log(name, age ...

  6. C++类的成员函数(在类外定义成员函数、inline成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

  7. 友元(友元函数、友元类和友元成员函数) C++

    有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...

  8. C++友元(友元函数、友元类和友元成员函数)

    友元(友元函数.友元类和友元成员函数) C++ 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私 ...

  9. 类1(this指针/const成员函数/类作用域/外部成员函数/返回this对象的函数)

    假设我们要设计一个包含以下操作的 Sales_data 类: 1.一个 isbn 成员函数,用于返回对象的 book_no 成员变量 2.一个 combine 成员函数,用于将一个 Sales_dat ...

随机推荐

  1. load和loads的区别

    相同点 load 和loads 都是实现"反序列化" 区别 1.loads loads针对内存对象 loads: 将 字符串 转换为 字典 # 这是一个字符串'{"b&q ...

  2. NO--16 vue之父子组件传值

    先创建项目并运行 vue init webpack-simple templatecd templatenpm inpm run dev 一.子组件访问父组件的数据 方式一 :子组件直接访问父组件的数 ...

  3. VMware两台虚拟机之间文件共享

    虚拟机A的文件拷贝到虚拟机B scp[参数][原路径][目标路径] eg: scp -r root@192.168.0.172:/home/rookie/下载/ /home/rooookie/下载/ ...

  4. C++STL 中的容器整体/逐元素操作方法 少写80%for循环

    本文中示例代码默认已引用 std 命名空间 累加 (std::accumulate) accumulate(begin, end, init, op) 返回给定区间内元素的累加值与给定初值的和,初值不 ...

  5. git实践笔记

    title: git实践笔记 date: 2016-10-15 18:40:26 tags: [Git] categories: [Tool,Git] --- 概述 本文记录常用 git 的功能和命令 ...

  6. python基础知识-12-模块的了解

    python其他知识目录 1.模块介绍: Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句.模块让你能够有逻辑地组织你 ...

  7. PHP版本对比【转】

    其他历史http://www.cnblogs.com/yjf512/p/3588466.html php5.3 改动: 1.realpath() 现在是完全与平台无关的. 结果是非法的相对路径比如FI ...

  8. Final阶段中间产物

    空天猎功能说明书:https://git.coding.net/liusx0303/Plane.git 空天猎代码控制:https://coding.net/u/MR__Chen/p/SkyHunte ...

  9. python中数据分析常用函数整理

    一. apply函数 作用:对 DataFrame 的某行/列应用函数之后,Apply 返回一些值.函数既可以使用默认的,也可以自定义.注意:在第二个输出中应用 head() 函数,因为它包含了很多行 ...

  10. Scrum Meeting 3 -2014.11.5

    这几天小伙伴们都在努力,研究出不少改进方案并加以设计和实施了,分词算法的优化进度可观,而其他的任务在改进的过程中产生了些问题,对于之前代码的设计感到疑惑,我们找到了上届的学长们咨询,他们也给出了不少建 ...