C++11新特性 模板参数默认类型

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












 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值