`
tcspecial
  • 浏览: 913793 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C++ 模板妙用

阅读更多

 

一. 模板全特化

有时当通用模板无法处理特定类型,需要对模板参数进行特殊处理,即为特化。

// 通用模板
template<class T>
struct A
{
	int x;	
};

// 特化T=double,模板为空
template<>
struct A<double>			
{
	int y;
};

 

 

模板偏特化,即对模板部分参数进行特化。

// 通用模板
template<class T, class P>	
void foo(T t, P p){}

// 偏特化,第二个参数指定int
template<class T>			
void foo(T t, int p)

 

 

二. 类型过滤

实现接口只支持某些类型参数,可很简单通过模板特化实现。

// 未实现
template<class T>
struct Support;			

// 特化int
template<>
struct Support<int>{};	

// 调用
Support<int> a;	  // ok
Support<char> b;  // error

 

 

三. 类型萃取

重构旧系统时,发现某个函数有多个冗余实现,只是参数类型不同,可考虑用模板进行提炼。

// 原有代码
void foo(int);
void foo(A const&);

// 模板层
template<class T> 
void foo(T const&);

 

调用:foo(1) 时会编译出错,因为该模板无法处理传值类型。如何用一个模板函数同时支持传值或引用方式呢?

这就要用到Type Traits技术了,简言之提取“被传进的对象”对应的返回类型,让同一个接口实现对应的功能。

// 主版本
template<class T>
struct TypeMapping
{
	typedef T const &type;
};

// 特化类型
template<>
struct TypeMapping<int>
{
	typedef int type;
};

// 接口层
template<class T>
void foo(TypeMapping<T>::type v)
{
	
}

 

四. 插入继承链

已知类继承关系:

A --> A1 --> B

A --> A2 --> C

A/B/C类均实现了foo()虚函数,现要为B和C的foo()添加一段相同的功能。在不修改父类A1、A2的前提下,如何实现?

我们可通过插入模板层来实现,该技巧也常用来模拟虚函数调用(虚函数调用会查询虚表,有性能损耗)。

// 模板层
template<class Base>
class X : public Base
{
	virtual void foo()
	{ 
		xxx;	// 新增功能代码
		Base::foo(); 
	}	
};

// B继承模板
class B: public X<A1> 
{
	typedef X<A1> base_class;
	virtual void foo()
	{ 
		xxx;
		base_class::foo();
	}
};

// C继承模板
class C: public X<A2> 
{
	typedef X<A2> base_class;
	virtual void foo()
	{ 
		xxx;
		base_class::foo();
	}
};

 

B/C只需要继承同一个模板层,常用来对库进行封装。

 

 

 

 

 

分享到:
评论

相关推荐

    C++实用编程技术百例精编与妙解

    3. **模板**:C++模板是一种泛型编程工具,可以用于创建函数和类,使得代码能处理多种类型的数据。模板分为函数模板和类模板,它们都提供了参数化类型的能力。书中的实例可能包含模板的使用,如创建泛型排序函数或...

    C++高级应用完整版

    1. **C++精要问题**:这部分内容可能涉及C++的复杂性和核心概念,如对象导向编程(OOP)、模板(templates)、命名空间(namespaces)以及C++11及更高版本引入的新特性,例如右值引用(rvalue references)和lambda...

    c++经典代码

    《C++经典代码》 ...通过深入研究这些代码,不仅可以掌握C++的基础知识,还能领略到高级特性的妙用,为成为一名优秀的C++程序员奠定坚实基础。无论你是初学者还是有经验的开发者,都能从中受益匪浅。

    jace的全部原代码类似于C++的ACE自适配通信框架

    在Jace中,C++的类和接口可以通过JNI(Java Native Interface)进行封装,使得Java程序能够像操作本地对象一样使用C++的库,这与ACE的自适配通信特性有异曲同工之妙。 在技术实现上,Jace利用了C++的模板和元编程...

    80天攻克雅思 C++要用的语言

    然而,"80天攻克雅思 C++要用的语言"这个标题可能意味着通过学习C++来提升逻辑思维和理解能力,这对理解和解答雅思阅读中的复杂文章可能有所帮助。下面我们将深入探讨C++语言如何提升这些能力,以及如何结合雅思阅读...

    C++入门经典(第三版)

    10. 模板:允许编写与数据类型无关的代码,提高代码的复用性和灵活性。 11. 异常:是一种特殊的类,用于处理程序执行期间出现的异常情况。 12. 输入输出:是C++标准库中用于处理数据输入和输出功能的类和函数。 ...

    Data Structures and Algorithms Using Python and C++

    同时,C++的STL(标准模板库)提供了丰富的容器(如vector、list、set等)和算法,与Python的内置数据结构和函数有异曲同工之妙。 四、实际应用 学习数据结构和算法不仅仅是理论知识,书中还会提供实际问题的应用...

    c++课件\第1讲 绪论

    推荐的教材和参考书目为学生提供了丰富的学习材料,包括《高级语言C++程序设计》、《C++程序设计教程》、《C++语言程序设计》、《高级语言C++程序设计编程范例与精解》和《C++实用编程技术百例精编与妙解》。...

    (C++_STL编程轻松入门基础

    标题和描述均提到了"C++ STL编程轻松入门基础",这明确指出了文章的主要焦点——C++的标准模板库(Standard Template Library,简称STL)的基础知识。STL是C++编程语言的重要组成部分,旨在提高代码的重用性和编程...

    hdoj4802C++代码

    hdoj4802标准模板库STL中map的妙用

    宏(#define)定义函数妙用

    在“宏#define定义函数妙用”这个主题中,我们主要探讨如何巧妙地利用宏定义来模拟函数,以及在实际编程中的一些应用场景。 首先,宏定义可以创建常量,比如定义`NULL`,在C/C++中通常用来表示空指针。`#define ...

    高质量C++/C编程指南

    1. **const的妙用**:展示如何通过const增强函数的健壮性和效率。 2. **效率提升技巧**:分享提高程序运行效率的方法,如循环优化、缓存利用等。 3. **编程建议**:总结作者多年经验所得的宝贵建议,涵盖代码审查、...

    c for mathematicians - an introduction for students and professionals

    C++是C语言的扩展,它增加了类、模板、异常处理等面向对象编程特性。学习C++时,我们首先会接触到变量、数据类型、运算符、控制结构(如条件语句和循环)以及函数。这些基础知识构成了任何编程语言的核心,对于数学...

    Boost程序库完全开发指南(高清版)

    Boost.Fusion则为元编程提供了高级抽象,它结合了元序列和模板元编程,增强了C++模板的能力。 其次,Boost库中包含了各种实用的工具,例如Boost.DateTime提供了日期和时间处理功能,超越了C++标准库中的chrono库。...

    VC可改变颜色和字体的记事

    7. **界面设计**: 使用Resource Editor或MFC的对话框模板,我们可以设计出包含“字体”和“颜色”按钮的用户界面。当用户点击这些按钮时,程序将弹出相应的对话框,允许用户进行选择。 在实际开发过程中,还需要...

    jacky_dai的博客文章.pdf

    3. **宏妙用**:宏可以用于条件编译、简化代码或提供模板化功能,但过度使用可能导致代码难以理解和维护,且易出错。 4. **Windows Template Library (WTL)**:WTL是一个轻量级的库,用于开发Windows应用程序,它...

    高级C语言 学完C语言来看这个绝对收获

    do/while(0)的妙用 do/while(0)可以用于实现零次或一次执行的循环结构。 #### 26. exit()和return()的区别 - `exit()`:立即退出程序,可传递退出状态码。 - `return`:返回函数调用者,可用于返回值。 #### 27...

    Introduction to Design Patterns in C Wit Alan Ezust

    设计模式通过提供一套经过实践验证的模板,帮助开发者更好地管理复杂性,并且通过这些模式,可以促进代码的复用以及团队间的沟通。 Qt4是一个跨平台的应用程序和用户界面框架,它为C++提供了一套丰富的API,使得...

    D语言白皮书及语法(中文)

    D语言还引入了模板,这是一种泛型编程的机制,类似于C++的模板,但更为强大和灵活。它可以用于创建泛型函数和泛型类,允许编写一次代码并应用于多种数据类型,提高了代码的重用性。同时,D语言的模板具有元编程能力...

Global site tag (gtag.js) - Google Analytics