//
// 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>
}