C++ 函数模板默认的模板参数
函数的默认模板参数
你可以为模板参数定义默认值,它们被称作 default template arguments(默认模板参数)。
它们甚至可以指向前一个模板参数。
1. 可以直接使用 operator?:
#include <iostream>
// 引入这个玩意儿生成共同类型
#include <type_traits>
template<typename T1, typename T2,
typename RT = std::decay_t<decltype(true ? T1() : T2())>>
RT max(T1 a, T2 b) {
return b < a ? a : b;
}
int main() {
using namespace std;
// 这个 double 专门为了 RT 而指定的, T1 和 T2 都可以通过调用参数推导出来
auto a = ::max(2, 3.2);
auto b = ::max(5, 1.2);
cout << "max(2, 3.2) = " << a << endl;
cout << "max(5, 1.2) = " << b << endl;
return 0;
}
这里要求我们能调用传入类型的默认构造函数。
2. 用 std::common_type<> 追踪返回的默认值
#include <iostream>
// 引入这个玩意儿生成共同类型
#include <type_traits>
template<typename T1, typename T2,
typename RT = std::common_type_t<T1, T2>>
RT max(T1 a, T2 b) {
return b < a ? a : b;
}
int main() {
using namespace std;
// 这个 double 专门为了 RT 而指定的, T1 和 T2 都可以通过调用参数推导出来
auto a = ::max(2, 3.2);
auto b = ::max(5, 1.2);
cout << "max(2, 3.2) = " << a << endl;
cout << "max(5, 1.2) = " << b << endl;
return 0;
}
由于 std::common_type<> decays,所以这里的返回值不能是引用。
但是这两种方法还是避免不了要显式指定参数列表的情况。
这里可以用一个其主要作用的默认模板参数。
#include <iostream>
// 引入这个玩意儿生成共同类型
#include <type_traits>
template<typename RT = long, typename T1, typename T2>
RT max(T1 a, T2 b) {
return b < a ? a : b;
}
int main() {
using namespace std;
// 这个 double 专门为了 RT 而指定的, T1 和 T2 都可以通过调用参数推导出来
int a = ::max(2, 3.2); // 返回 int 类型
long b = ::max(5, 1.2); // 返回 long 类型
cout << "max(2, 3.2) = " << a << endl;
cout << "max(5, 1.2) = " << b << endl;
return 0;
}
这里我们还是需要依赖于之前模板参数的默认了类型,所以最简单的方法还是让编译器自动推导返回类型。
也就是用 auto。
C++ 函数模板默认的模板参数的更多相关文章
- C++ primer(八)--内联函数 引用变量 引用传递函数参数 函数重载/模板/模板具体化
一.内联函数 常规函数和内联函数的区别在于C++编译器如何将他们组合到程序中.编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入到计算机内存中,因此每 ...
- [Reprint] C++函数模板与类模板实例解析
这篇文章主要介绍了C++函数模板与类模板,需要的朋友可以参考下 本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程( ...
- C++学习之函数模板与类模板
泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思.泛型编程最初诞生于C++中,目的是为了实现C++ ...
- C++进阶-1-模板基础(函数模板、类模板)
C++进阶 模板 1.1 函数模板 1 #include<iostream> 2 using namespace std; 3 4 // 模板 5 6 // 模板的简单实例 7 // 要求 ...
- C++学习35 模板中的函数式参数
C++对模板类的支持比较灵活,模板类的参数中除了可以有类型参数,还可以有普通参数.例如: template<typename T, int N> class Demo{ }; N 是一个普 ...
- C++_进阶之函数模板_类模板
C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
- C++复习:函数模板和类模板
前言 C++提供了函数模板(function template).所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表.这个通用函数就称为函数模板.凡是函数体 ...
- C++17尝鲜:类模板中的模板参数自动推导
模板参数自动推导 在C++17之前,类模板构造器的模板参数是不能像函数模板的模板参数那样被自动推导的,比如我们无法写 std::pair a{1, "a"s}; // C++17 ...
- 【校招面试 之 C/C++】第2题 函数模板、类模板、特化、偏特化
1.C++模板 说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板.我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样 ...
随机推荐
- 2017-9-15-Linux移植:WinSCP软件 & SSH Server开启
在Linux电脑上面安装了TFTP server,但是各种不给力,决定寻找其他办法在Windows和Linux之间传输文件. WinSCP 是一个 Windows 环境下使用 SSH 的开源图形化 S ...
- 潭州课堂25班:Ph201805201 django 项目 第二十九课 docker实例,文件下载前后台实现 (课堂笔记)
docker 实例 :wq!保存退出 放入一个 html 文件 权限不够,加 sudo 查看本地仓库的 image 运行 docker -- name,后跟个运行名, -p 物理机端口映射到容器端口, ...
- Stack [NOIP模拟] [组合数学经典]
Description栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列.你已经知道栈的操作有两种: push 和 pop ,前者是将一个元素进栈,后者是将栈顶元素弹出.现 ...
- 2017.08.06【NOIP提高组】模拟赛B组
Summary 今天的比赛60+100+100=260分,没有想到第一题正解是搜索,我与AK差一段距离,这段距离,叫倒着搜.总的来说不是很难. Problem T1 天平 题目大意 给你N个排序好的砝 ...
- JS基本数据类型
基本数据类型: Undefined,null,boolean,number,string symbol(ES6) 复杂数据类型: object undefined: 变量声明未初始化,自动为undef ...
- Java 深复制和浅复制
浅复制是指复制对象时仅仅复制对象本身(包括对象中的基本变量),而不复制对象包含的引用指向的对象.深复制不仅复制对象本身,而且复制对象包含的引用指向的对象. 复制对象时需要调用Object类的clone ...
- 3ds max学习笔记(十一)-- 修改器
1.修改器列表: 将常用的修改器放放置在集里: 1.点击[配置]按钮,勾选[显示按钮] 选择[配置修改器集],在新出的弹窗里通过左右拖拽进行设置: 2,选择之后,点击[确定]进行保存:
- java第二周的学习知识2
sPrimitive() 判断是否为基本类型,Class.isPrimitive(),原始类型下返回true. for(Size value:Size.values()) { //此代码中的value ...
- Codeforces Round #443 (Div. 1) A. Short Program
A. Short Program link http://codeforces.com/contest/878/problem/A describe Petya learned a new progr ...
- HTTP1.1协议-RFC2616-中文版课前资料收集
1.http rfc大致讲了什么? 2.解决了什么问题? HTTP协议描述的是发送方与接收方的通信协议 协议功能: HTTP协议(HyperText Transfer Protocol,超文本传输协议 ...