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
5 extern "C" template<typename T> void invalid();

Function templates can have internal linkage.

1 // use keyword static to indicate internal linkage
2 template<typename T> static void internal();

Template Parameters

1. type parameter

1 // a template with one type parameter and one non-type parameter
2 template<typename, int> class SomeClass;

2. non-type parameter

A non-type parameter must have determined value during compile-time or link-time. Allowed are: integer/enumeration; pointer; reference

1 // actually these two are the same, array is converted to a pointer
2 template<int buf[5]> class SomeClass;
3 template<int * buf> class SomecClass;

3. template parameter

1 // a function template with a template parameter
2 // class is ok but union and struct are not
3 template<typename<typename X> class C>
4 void f(C<int> * p);

Interestingly, the parameter of the parameter (which is a template)  of the template cannot be used by the (outer) template.

1 template<template<typename T> class List>
2 class Node {
3     static T * storage;    // no! T is the parameter of the parameter
4     ...
5 };

Default parameters

 1 #include<iostream>
 2 #include<typeinfo>
 3 #include<string>
 4
 5 using namespace std;
 6
 7 // you can specify default value for T2 only if you have done that
 8 // for the parameters after it
 9 template<typename T1, typename T2, typename T3=int>
10 class Triple;
11
12 template<typename T1, typename T2=double, typename T3>
13 class Triple;
14
15 template<typename T1=char, typename T2, typename T3>
16 class Triple;
17
18 // definition
19 template<typename T1, typename T2, typename T3>
20 class Triple
21 {
22 public:
23     Triple()
24     {
25         T1 t1;
26         T2 t2;
27         T3 t3;
28         cout << typeid(t1).name() << endl;
29         cout << typeid(t2).name() << endl;
30         cout << typeid(t3).name() << endl;
31
32     }
33 };
34
35 int main()
36 {
37     Triple<> trio;
38     return 0;
39 }

Actual Parameters for a Template

SUBSTITUTION FAILURE IS NOT AN ERROR

1. Local classes and local enumerations cannot be real type parameters

2. Unamed classes and unamed enumerations cannot neither.

changelog:

2015/6/26 Start this page.

时间: 2024-11-15 13:27:22

C++模板编程 - 第八章 深入模板基础的相关文章

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

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

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

转自:https://www.cnblogs.com/zhoug2020/p/6581477.html 模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护. 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 templ

C++模板编程 - 第五章 技巧性基础知识

Keyword Typename 1 template<typename T> 2 class SomeClass 3 { 4 typename T::subtype * ptr; 5 }; 如果没有typename,T::subtype会被认为是一个静态成员. A practical example: 1 // print elements in a STL container 2 template<typename T> 3 void print(T const & c

C++模板编程 - 第二章 - 函数模板

模板被编译两次 书上说模板被编译两次:一次是实例化之前,检查模板代码本身,这个好理解,就是检查和模板没有关系的代码:第二次编译是在实例化的时候,看看把类型带入进去有没有问题,比如说字符串没有除法. 还有一个需要注意的问题:模板在进行实例化的时候,编译器要能够看到模板的定义.下面的代码会挂掉,因为main.cpp把max.h包含进来,但是其中没有max的实现 1 // max.h 2 template<typename T> 3 max..... 4 5 // max.cpp 6 #includ

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++]C++的模板编程

我是搬运工,原文地址:http://www.cppblog.com/besterChen/archive/2010/07/22/121000.html 当我们越来越多的使用C++的特性, 将越来越多的问题和事物抽象成对象时, 我们不难发现:很多对象都具有共性. 比如 数值可以增加.减少:字符串也可以增加减少. 它们的动作是相似的, 只是对象的类型不同而已. C++ 提供了“模板”这一特性, 可以将“类型” 参数化, 使得编写的代码更具有通用性. 因此大家都称模板编程为 “通用编程”或 “泛型编程

C++的模板编程

当我们越来越多的使用C++的特性, 将越来越多的问题和事物抽象成对象时, 我们不难发现:很多对象都具有共性. 比如 数值可以增加.减少:字符串也可以增加减少. 它们的动作是相似的, 只是对象的类型不同而已. C++ 提供了“模板”这一特性, 可以将“类型” 参数化, 使得编写的代码更具有通用性. 因此大家都称模板编程为 “通用编程”或 “泛型编程”. 一般而言, 模板分为 函数模板 和 类模板,下面就让我们分别来了解一下它们. 一. 函数模板 1. 函数模板的定义和使用 定义一个模板函数的格式并

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

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