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 ...
随机推荐
- 了解dto概念,什么是DTO
了解dto概念 此博文收集整理了一些主流的文章对于DTO模式的解读,他们大体相似而又各有所不同.对于设计模式的解读也是一个仁者见仁智者见智的事情,不过设计模式往往都是前辈们在遇到一类特定的问题下而 ...
- hihocoder1545 : 小Hi和小Ho的对弈游戏(树上博弈&nim博弈)
描述 小Hi和小Ho经常一起结对编程,他们通过各种对弈游戏决定谁担任Driver谁担任Observer. 今天他们的对弈是在一棵有根树 T 上进行的.小Hi和小Ho轮流进行删除操作,其中小Hi先手. ...
- ZOJ2345Gold Coins
昨天做过一样的题: 平方和公式:n*(n+1)*(2n+1)/6 #include<cstdio> #include<cstdlib> #include<iostream ...
- 20155338 2016-2017-2 《Java程序设计》第8周学习总结
20155338 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 一.日志 API简介 java++.util.logging包提供了日志功能相关类与接口,不 ...
- page 分页
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 我的第一个Mybatis程序
第一个Mybatis程序 在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架 MyBatis由iBatis演化而来 iBATIS一词来源于“i ...
- CTF-练习平台-Misc之 MISC图穷匕见
十七.MISC图穷匕见 用txt打开,发现文件尾有东西,截取出来 用notepad++的插件 HEX转ASCII 得到35019个坐标 根据图片的详细信息的提示 应该是要把这些坐标转换为图形 这里使用 ...
- repo学习笔记
1. 遍历所有的git仓库,并在每个仓库执行-c所指定的命令(被执行的命令不限于git命令,而是任何被系统支持的命令,比如:ls . pwd .cp 等 . $ repo forall -c &quo ...
- Oracle C#处理时间类型的Insert
首先如果直接 parm.Value=DateTime.Now; insert into table (TheTime)Value(@parm); 执行sql就会报错 ----------- ...
- 栈的一个实例——Dijkstra的双栈算术表达式求值法
Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...