函数模板

函数模板主要是泛型在函数的中的应用,通过泛型可以让函数处理各种各样的数据类型

简单的列子

#include <iostream>
using namespace std; template <typename T> //定义泛型T
T add (T t1, T t2) {
return t1 + t2;
} int main () {
cout << add(10.5, 0.8) << endl;
}

上面的例子中首先定义了泛型T,然后在add函数中使用了泛型,typename关键字也可以写成class。

明确指定类型
#include <iostream>
#include <string>
using namespace std; template <typename T, typename E> //定义泛型T
E add (T t, E e) {
if (t > 1)
return e + "1";
else
return e + "1.5";
} int main () {
cout << add<int, string>(10, "hello") << endl;
}

上面的代码中我们在调用add时显示的指定传入的类型

函数模板的重载

函数的模板的重载可函数的重载一个道理,都是通过函数名和函数参数列表来确定的

#include <iostream>
#include <string>
using namespace std; template <typename T>
T test(T t) {
return t;
} template <typename T>
T test(T t, int n) {
return n;
} int main () {
cout << test<int>(3) << endl;
cout << test<float>(3.5, 10) << endl;
}

第一个test(3)会调用第一个函数模板,而 test(3.5, 10)会调用第二函数模板

函数包装器

模板函数中不仅能接受普通类型作为参数,还能接受函数。当使用函数作为参数时,需要用到函数包装器

#include <iostream>
#include <functional>
using std::cout;
using std::endl;
using std::function; template <typename V, typename F>
V add (V v1, V v2, F f) {
return f(v1, v2);
} int main () { function<int(int, int)> fun = [](int v1, int v2) {
return v1 + v2;
}; cout << add(1, 2, fun) << endl;
}

上面的代码中需引入functional库,并定义了一个函数。

function<int(int, int)> fun = [](int v1, int v2) {
return v1 + v2;
};

中括号中第一个int表示返回值类型,后面的小括号表示函数接受的参数。函数包装器的实质时函数指针。通过函数包装器我们可以在一个函数内部定义一个函数了。

函数包装器指向外部函数
#include <iostream>
#include <functional>
using namespace std; void test(int i, int j) {
cout << i << j << endl;
} int main () {
function<void(int, int)> fun = test;
fun(1,3);
}

引用包装器

要想在函数模板内部修改传入的值,需要传递变量的引用或者指针,一般情况下,我们会将变量的引用传递进去,这时将函数模板参数设置为引用或者使用引用包装器。

函数接受引用
#include <iostream>
#include <string>
using namespace std; template <typename T>
void test(T t) {
t = 100;
} int main () {
int a = 10;
test<int&>(a);
cout << a << endl;
}
使用引用包装器

引用包装器有些问题,尽量避免使用

#include <iostream>
#include <functional>
using namespace std; template <typename T>
void test(T t) {
t += 100;
} int main () {
int a = 10;
test(ref(a));
cout << a << endl;
}

上面的代码中去掉模板中的+号就会便宜错误

c++之旅:函数模板的更多相关文章

  1. c++函数模板作为类的成员函数,编译报错LNK2019的解决方法

    为了使某个类的成员函数能对不同的参数进行相同的处理,需要用到函数模板,即template<typename T> void Function(). 编译时报错LNK2019 解决方法: 1 ...

  2. C++STL - 函数模板

    模板主要是为了泛型编程,做到与类型无关 模板有函数模板和类模板,本文主要整理的是函数模板 1.函数模板定义 template<typename 类型形参1,typename 类型形参2,...& ...

  3. 使用getopt_long来解析参数的小函数模板

    getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct o ...

  4. C++函数重载和函数模板

    1.函数重载 这是小菜鸟写的一个例子. 函数重载应该注意以下几点: 1.1重载函数有类似的功能: 1.2只能以参数的类型(形参个数和类型)来重载函数, int max(int a,int b);flo ...

  5. 零值初始化&字符串常数作为函数模板参数

    1.在定义一个局部变量时,并希望该局部变量的初始化一个值,可以显示调用其默认构造函数,使其值为0(bool类型默认值为false). template <typename T> void ...

  6. 让gcc支持成员函数模板的trick

    让gcc支持成员函数模板的trick 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议   gcc 4.7.3 不支持成员 ...

  7. 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板

    [源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...

  8. Effective C++ -----条款45:运用成员函数模板接受所有兼容类型

    请使用member function templates(成员函数模板)生成”可接受所有兼容类型“的函数. 如果你声明member templates 用于“泛化copy构造”或“泛化assignme ...

  9. c++ 左值右值 函数模板

    1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...

随机推荐

  1. 剑指 offer set 25 求 1+2+...+n

    题目 要求不能使用乘除法, for, while, if else, switch, case 等关键字 思路 1. 循环已经命令禁止, 禁用 if, 意味着递归也不能使用. 但即便如此, 我们仍然要 ...

  2. Python学习笔记5-元组Tuple

    tuple和list非常类似,但是tuple一旦初始化就不能修改,它也没有append(),insert()这样的方法.其他获取元素的方法和list是一样的 元组是用圆括号括起来的,其中的元素之间用逗 ...

  3. 应用开发之Asp.net

    本章简言 上一章中笔者讲到关于Linq和EF的用法.并以hibernate来进行讲解.那么本章笔者来讲一下C#的Asp.Net.即是在B/S模式下开发.现在企业大部分的业务都是面向B/S模式的.所以对 ...

  4. Popwindow系列

    一系列干货等你来拿 关于我:http://www.cnblogs.com/dubo-/ 项目中也有很多实用的事例,等待录入中...

  5. phpcms V9内容页调用标签

    1.页面标题:{$title} 2.发表时间:{$inputtime} 3.内容来源:{$copyfrom} 4.文章内容:{$content} 5.缩略图地址:{$thumb} 6.组图列表: {l ...

  6. TCP连接的建立与终止过程详解

    TCP连接的建立与终止: 1.TCP连接的建立      设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客 ...

  7. 『SharePoint 2010』Sharepoint 2010 Form 身份认证的实现(基于AD)

    一.进管理中心,创建一个应用程序,配置如下: 二.填端口号,和选择form身份认证,以及填写成员和角色,其他都默认就可以了 三.使用SharePoint 2010 Management Shell在里 ...

  8. 加载CDN加速服务地址

    Jquery是个非常流行的JS前端框架,在很多网站都能看到它的身影.很多网站都喜欢采用一些Jquery CDN加速服务,这样网站加载jquery会更快.之前火端网络的一些网站都是使用Google的jq ...

  9. 160420、zTree获取所有选中节点数据

    <!DOCTYPE html><HTML><HEAD> <TITLE> ZTREE DEMO - Standard Data </TITLE> ...

  10. SharePoint Managed Metadata 使用总结

    前言 本文完全原创,转载请说明出处,希望对大家有用. 在SharePoint开发中,通常我们会将数据存储在列表,文档库或者直接存到数据库.但涉及到数据的层级结构时,用列表等存储实现并不是一件简单的事情 ...