c++官方文档-模版函数和重载
#include<stdio.h>
#include<iostream>
#include<queue>
#include<map>
#include<memory.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <climits>
#include <sstream>
#include <cstdlib>
using namespace std; /**
* 重载,函数有不同数目的参数或者是不同类型的参数
*/
int operate(int a, int b)
{
return (a * b);
}
/**
*注意只有返回类型不同不是重载
*/
double operate(double a, double b)
{
return (a / b);
}
/**
* 重载的函数可能会有同样的定义,比如下面这俩个函数
*/ int sum(int a, int b)
{
return a + b;
}
double sum(double a, double b)
{
return a + b;
} /**
* 泛型
* template <template-parameters> function-declaration
* parameter class type or typename type
*
*/
template<class someType> someType sum(someType a, someType b)
{
return a + b + 8;
}
/**
* In all cases, it represents a generic type that will be determined on the moment the template is instantiated.
* 代表泛型的类型在模版实列化的时候决定
*/
template<typename someType> someType sum2(someType a, someType b)
{
return a + b + 8;
}
/**
* Instantiating a template is applying the template to create a function using particular types or values for its template parameters
*实例模版指应用模版创建一个函数,使用特定的类型或者值转递给模版参数
*
*This is done by calling the function template,with the same syntax as calling a regular function,but specifying the template arguments enclosed in angle brackets:
*由正在被调用的函数模版来完成,就像调用一个普通函数一样,但是需要在尖括号内指定模版参数
*如下
*name <template-arguments>(function-arguments)
*x=sum<int>(10,20)
*
*The function sum<int> is just one of the possible instantiations of function template sum. In this case, by using int as template argument in the call, the compiler automatically instantiates a version of sum where each occurrence of SomeType is replaced by int, as if it was defined as:
*
*编译器自动生成实例化一个int版本的sum函数,如下
*
*int sum (int a, int b)
*{
* return a+b;
*}
*/
template<typename T, typename R> T fs(T t, R r)
{
return r + t;
}
template<class T, class U>
bool are_equal(T a, U b)
{
return (a == b);
}
/**
*无类型模版参数
*/
template<class T, int N> T fixed_multiply(T val)
{
return val * N;
}
int main()
{
int x = 5, y = 2;
double n = 5.1111, m = 2.0;
//cout << operate(x, y) << '\n';
//cout << operate(n, m) << '\n';
//模版
int k = sum<int>(x, y);
cout << k << endl;
double dk = sum<double>(n, m);
cout << dk << endl;
//注意这个和sum<double>
dk = sum(n, m);
//without the type enclosed in angle brackets. Naturally, for that, the type shall be unambiguous. If sum is called with arguments of different types, the compiler may not be able to deduce the type of T automatically.
//对上面sum的解释,如果尖括号内没有写类型,实际上表示类型任意,如果sum再被调用时参数是不同的类型,编译器可能不能自动推测出T的类型
cout << dk << endl;
//把sum函数注释,下面这句话会导致编译不过
//dk = sum(x,n);
//注意这俩个
int kkk = fs<double, int>(n, x);
// double kkk = fs<double,int>(n,x);
cout << kkk << endl; if(are_equal(10, 10.0))
cout << "x and y are equal\n";
else
cout << "x and y are not equal\n";
//are_equal(10,10.0)和are_equal<int,double>(10,10.0)一样
//没有任意的可能性,因为数字字面量总是会指定类型, integer literals always produce values of type int, and floating-point literals always produce values of type double. Therefore 10 has always type int and 10.0 has always type double. //无类型模版参数
cout<<fixed_multiply<int,2>(10)<<endl;
cout<<fixed_multiply<int,3>(10)<<endl;
/**
* 上面和template<class int,class int>有个主要的区别
*But there exists a major difference: the value of template parameters is determined on compile-time to generate a different instantiation of the function fixed_multiply, and thus the value of that argument is never passed during runtime: The two calls to fixed_multiply in main essentially call two versions of the function: one that always multiplies by two, and one that always multiplies by three. For that same reason, the second template argument needs to be a constant expression (it cannot be passed a variable).
*
*但是这存在一个主要的区别,模版的参数在编译时被确定用于生成不同fixed_multiply的实例
*所以,参数的值永远都不会在运行时传递.在main里面调用的俩个fixed_multiply本质上
*调用俩个不同版本的函数,一个总是乘2,一个总是乘3.因此,模版上第二个参数需要是一个常量表达式(它不能传递变量)
*
*int kkkk = 2 or const int kkkk =2;
*cout<<fixed_multiply<int,3>(10)<<endl;
*/
//error
// int kkkk = 4 ;
// cout<<fixed_multiply<int,kkkk>(10)<<endl;
//ok
const int kkkk2 =20;
cout<<fixed_multiply<int,kkkk2>(10)<<endl;
return 0;
}
c++官方文档-模版函数和重载的更多相关文章
- c++官方文档-模版类
#include <iostream> using namespace std; template<class T> class MyPair { private: T t[] ...
- swift官方文档中的函数闭包是怎么理解的?
官方文档中的16页: numbers.map({ (number: Int) -> Int in let result = * number return result }) 不知道这个怎么用, ...
- tensorflow官方文档中的sub 和mul中的函数已经在API中改名了
在照着tensorflow 官方文档和极客学院中tensorflow中文文档学习tensorflow时,遇到下面的两个问题: 1)AttributeError: module 'tensorflow' ...
- 【pytest官方文档】解读- 插件开发之hooks 函数(钩子)
上一节讲到如何安装和使用第三方插件,用法很简单.接下来解读下如何自己开发pytest插件. 但是,由于一个插件包含一个或多个钩子函数开发而来,所以在具体开发插件之前还需要先学习hooks函数. 一.什 ...
- Android的AutoCompleteTextView在API17高版本添加的setText函数在低版本系统居然能正常调用?官方文档是不是不靠谱了?
官方文档:https://developer.android.com/reference/android/widget/AutoCompleteTextView.html#setText(java.l ...
- Kotlin开发语言文档(官方文档)-- 目录
开始阅读Kotlin官方文档.先上文档目录.有些内容还未阅读,有些目录标目翻译还需琢磨琢磨.后续再将具体内容的链接逐步加上. 文档链接:https://kotlinlang.org/docs/kotl ...
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- python3 asyncio官方文档中文版
事件循环基类 事件循环基类 事件循环是由asyncio提供的核心执行装置.它提供了多种服务,包括: 注册.执行和关闭延时调用(超时) 为各种通信创建客户端和服务端传输 为一个外部程序通信启动子进程和相 ...
- 《Apache Velocity用户指南》官方文档
http://ifeve.com/apache-velocity-dev/ <Apache Velocity用户指南>官方文档 原文链接 译文连接 译者:小村长 校对:方腾飞 Qui ...
随机推荐
- JS经典面试题
自己总结了一些JS面试题 希望能够帮助正在找工作的程序猿(●´∀`●) 1.js 实现一个函数对javascript中json 对象进行克隆 var oldObject ="sdf" ...
- C#/.NET 使用 CommandLineParser 来标准化地解析命令行
CommandLineParser 是一款用于解析命令行参数的 NuGet 包.你只需要关注你的业务,而命令行解析只需要极少量的配置代码. 本文将介绍如何使用 CommandLineParser 高效 ...
- SharePoint 列表多表联合查询
在SharePoint平台二次开发中,我们有时需要涉及多表关联查询展示多列表中的不同字段信息:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,有一定的局限性,需 ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo
在上一篇里,我已经建立了一个简单的Web-Demo应用程序.这一篇将记录将此Demo程序改造成一个Web Api应用程序. 一.添加ASP.NET Core MVC包 1. 在project.json ...
- 通过直接编码添加折线图到ChartControl
https://documentation.devexpress.com/#WindowsForms/CustomDocument2976 ChartControl lineChart = new C ...
- vue-resource 知识点
vue-resource 发送json到后端: Content-Type字段的类型是application/json,就会有options请求. http://www.ruanyifeng.com/b ...
- mysql 存储过程知识点
一.创建存储过程 create procedure sp_name() begin ......... end 二.调用存储过程 1.基本语法:call sp_name(): 注意:存储过程名称后面必 ...
- pm2 知识点
pm2:node进程管理工具 pm2 命令: pm2 命令 作用 pm start xxx.js 启动 xxx.js pm stop xxx.js 停止 xxx.js pm2 list 显示所有进程状 ...
- ubuntu 安装时分辨率太小 导致无法继续安装
当分辨率是800 *600时,底部的按钮无法显示,不能继续安装. 可以在右上角,点击电源按钮,在系统设置中调整显示的分辨率后,继续安装.
- Android画图之抗锯齿 paint 和 Canvas 两种方式
在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿.其实Android自带了解决方式. 方法一:给Paint加上抗锯齿标志.然后将Paint对象作为参数传给canvas的绘制方法. ...