// // main.m // test_cpp_template_01 // // Created by jeffasd on 2017/10/1. //
Copyright © 2017年 jeffasd. All rights reserved. // // C++11新特性 模板参数默认类型
#include <string> #include <iostream> using namespace std; template <typename
_Tp1, typename _Tp2> bool func (_Tp1 &a, _Tp2 &b) { return a > b; } // C++11新特性
模板参数默认类型 template <typename _Tp1, typename _Tp2 = float> bool funcDefault (_Tp1
a, _Tp2 b) { cout << typeid(a).name() << endl; cout << typeid(b).name() <<
endl; return a > b; } // 编译出错 // 模板默认类型不能重复定以 //template <typename _Tp1,
typename _Tp2 = int> //bool funcDefault (_Tp1 a, _Tp2 b) { // cout <<
typeid(a).name() << endl; // cout << typeid(b).name() << endl; // return a > b;
//} // 失去了模板函数的意义 template <typename _Tp1, int = 0> bool funcDefault (_Tp1 a,
bool b) { cout << typeid(a).name() << endl; cout << typeid(b).name() << endl;
return a > b; } // 失去了模板函数的意义 template <typename _Tp1, int = 0> bool
funcDefault (_Tp1 a, int b) { cout << typeid(a).name() << endl; cout <<
typeid(b).name() << endl; return a > b; } // 失去了模板函数的意义
//第二个模板参数类型只能为int类型或(class *)指针类型,bool类型能编译通过但是一旦调用则编译通不过 template <typename
_Tp1, bool = 0> bool funcDefault (_Tp1 a, bool b) { cout << typeid(a).name() <<
endl; cout << typeid(b).name() << endl; return a > b; } // 失去了模板函数的意义 template
<typename _Tp1, bool = 0> bool funcDefault (_Tp1 a, int b) { cout <<
typeid(a).name() << endl; cout << typeid(b).name() << endl; return a > b; }
template <typename _Tp1, typename _Tp2> bool funcDefault (_Tp1 a) { cout <<
typeid(a).name() << endl; return true; } // 模板参数类型带默认模板类型 template <typename
_Tp1, int = 3> bool funcDefault (_Tp1 a) { cout << typeid(a).name() << endl;
return true; } //// 重复定义 编译出错 //template <typename _Tp1, typename _Tp2 = float>
//bool funcDefault (_Tp1 a) { // cout << typeid(a).name() << endl; // return
true; //} template <typename _Tp1, int * = nullptr> bool funcDefault (_Tp1 a) {
cout << typeid(a).name() << endl; return true; } class Person {}; class Student
: public Person {}; #warning 此用法需要注意
此用法常常配合std::enable_if一起使用来实现编译期的模板匹配,实现偏特化过程。 template <typename _Tp1, Person *
= nullptr> bool funcDefault (_Tp1 a) { cout << typeid(a).name() << endl; return
true; } template <typename _Tp1, Student * = nullptr> bool funcDefault (_Tp1 a)
{ cout << typeid(a).name() << endl; return true; } // A non-type template
parameter cannot have type 'Person' // 模板默认类型不能为自定义类型 //template <typename
_Tp1, Person = Person()> //bool funcDefault (_Tp1 a) { // cout <<
typeid(a).name() << endl; // return true; //} int main(int argc, const char *
argv[]) { funcDefault(3, 4.0); funcDefault<int, 3>(3, 4); funcDefault<int,
3>(3, true); // bool boolDefault = true; // funcDefault<int, boolDefault>(3,
4);// 无法编译 // funcDefault<int, boolDefault>(3, true); funcDefault<int,
float>(2.0); // 调用 template <typename _Tp1, typename _Tp2> funcDefault<int,
int>(2); // 调用 template <typename _Tp1, typename _Tp2> funcDefault<int, 2>(2);
// 调用 template <typename _Tp1, int = 3> // funcDefault<int, 2.0f>(2); //
编译错误没有对应的模板函数 funcDefault<int, int *>(2.0); // 调用带默认类型的模板 template <typename
_Tp1, int = 3> funcDefault<int, Person *>(2.0); // 调用带默认类型的模板 template
<typename _Tp1, int = 3> funcDefault<int, Student *>(2.0); // 调用带默认类型的模板
template <typename _Tp1, int = 3> }
 

技术
©2019-2020 Toolsou All rights reserved,
2021年2月程序员工资统计,平均15144元初识MySQL之综合复习篇(干货)Faster RCNN系列算法原理讲解(笔记)谷歌称居家办公影响工作效率!2021 年将回归线下办公C语言控制台小游戏,打砖块GDOI2019 游记CSS架构设计Python基础知识整理笔记2019年终总结——工作第二年用C++跟你聊聊“原型模式” (复制/拷贝构造函数)