#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++官方文档-模版函数和重载的更多相关文章

  1. c++官方文档-模版类

    #include <iostream> using namespace std; template<class T> class MyPair { private: T t[] ...

  2. swift官方文档中的函数闭包是怎么理解的?

    官方文档中的16页: numbers.map({ (number: Int) -> Int in let result = * number return result }) 不知道这个怎么用, ...

  3. tensorflow官方文档中的sub 和mul中的函数已经在API中改名了

    在照着tensorflow 官方文档和极客学院中tensorflow中文文档学习tensorflow时,遇到下面的两个问题: 1)AttributeError: module 'tensorflow' ...

  4. 【pytest官方文档】解读- 插件开发之hooks 函数(钩子)

    上一节讲到如何安装和使用第三方插件,用法很简单.接下来解读下如何自己开发pytest插件. 但是,由于一个插件包含一个或多个钩子函数开发而来,所以在具体开发插件之前还需要先学习hooks函数. 一.什 ...

  5. Android的AutoCompleteTextView在API17高版本添加的setText函数在低版本系统居然能正常调用?官方文档是不是不靠谱了?

    官方文档:https://developer.android.com/reference/android/widget/AutoCompleteTextView.html#setText(java.l ...

  6. Kotlin开发语言文档(官方文档)-- 目录

    开始阅读Kotlin官方文档.先上文档目录.有些内容还未阅读,有些目录标目翻译还需琢磨琢磨.后续再将具体内容的链接逐步加上. 文档链接:https://kotlinlang.org/docs/kotl ...

  7. OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)

    OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...

  8. python3 asyncio官方文档中文版

    事件循环基类 事件循环基类 事件循环是由asyncio提供的核心执行装置.它提供了多种服务,包括: 注册.执行和关闭延时调用(超时) 为各种通信创建客户端和服务端传输 为一个外部程序通信启动子进程和相 ...

  9. 《Apache Velocity用户指南》官方文档

    http://ifeve.com/apache-velocity-dev/ <Apache Velocity用户指南>官方文档 原文链接   译文连接 译者:小村长  校对:方腾飞 Qui ...

随机推荐

  1. PR4

    4.1视频切换特效: 视频切换:视频和视频之间的过渡 4.2特效参数设置方法 4.3视频切换特效的技巧 多张图片,拖入特效慢. 选中多张图片 右键选中“设置所选..” 设置图片时间: 点常规后 设置完 ...

  2. POJ3276(遍历+区间修改)

    http://poj.org/problem?id=3276 题意:n(n<=5000)头牛站成线,有朝前有朝后的的,然后每次可以选择大小为k的区间里的牛全部转向,会有一个最小操作m次使得它们全 ...

  3. [题解] CodeM美团点评编程竞赛资格赛题

    最近看到牛课网美团一个编程竞赛,想着做做看,结果一写就是两天..真是写不动了啊.话不多说,下面开始我的题解. 题目大致还是比较考察思维和代码能力(因为自己代码能力较弱,才会觉得比较考察代码能力吧= = ...

  4. HTTP报头:通用报头,请求报头,响应报头和实体报头

    缓存控制优先级从高到低分别是Pragma -> Cache-Control -> Expires 报头 每一个报头都是由 [名称 + ":" + 空格 + 值 + ] ...

  5. LOJ 6053 简单的函数——min_25筛

    题目:https://loj.ac/problem/6053 min_25筛:https://www.cnblogs.com/cjyyb/p/9185093.html 这里把计算 s( n , j ) ...

  6. JZ2440 裸机驱动 第6章 存储控制器

    本章目标:     了解S3C2410/S3C2440地址空间的布局     掌握如何通过总线形式访问扩展的外设,比如内存.NOR Flash.网卡等 ························ ...

  7. IO测试工具之fio详解(转)

    http://www.cnblogs.com/raykuan/p/6914748.html 目前主流的第三方IO测试工具有fio.iometer和Orion,这三种工具各有千秋. fio在Linux系 ...

  8. Hibernate对substring和cast的支持问题

    http://blog.sina.com.cn/s/blog_8acd9e4b0102uwev.html Hibernate对substring和cast的支持问题 问题:要比较日期的范围...这是只 ...

  9. linux 线程的同步 二 (互斥锁和条件变量)

    互斥锁和条件变量 为了允许在线程或进程之间共享数据,同步时必须的,互斥锁和条件变量是同步的基本组成部分. 1.互斥锁 互斥锁是用来保护临界区资源,实际上保护的是临界区中被操纵的数据,互斥锁通常用于保护 ...

  10. mysql视图 新手的问答

    ☺ζั͡ޓއއއ๓º♥双٩(•(365335093) 16:03:02 创建的视图能保存多长时间,保存在哪啊 上天&宠儿(961431958) 16:08:59 数据库 上天&宠儿(9 ...