C++STL - 函数模板
template<typename A,typenamen B,typename _C> A function(B arg){ _C var; ... }
即用<>中的替换template<>中的内容
#include <iostream> using namespace std; template<typename T> T add (T x, T y) { return x + y; } class Integer { public: Integer () : m_var (arg) {} friend ostream& operator<< (ostream& os,Integer const& i) { return os << i.m_var; } Integer const operator+ (Integer const& rhs) const { return m_var + rhs.m_var; } private: int m_var; }; int main (void) { cout << add<, ) << endl; cout << add<double> (1.3, 4.6) << endl; cout << add<string> ("Hello, ", "World !") << endl; // cout << add<char const*> ("Hello, ","World !") << endl; cout << add<Integer> (, ) << endl; ; }
#include <iostream> #include <typeinfo> using namespace std; template<typename T> void foo (T x, T y) { cout << "foo: " << typeid (x).name () << ' ' << typeid (y).name () << endl; } template<typename T> void bar (T const& x, T const& y) { cout << "bar: " << typeid (x).name () << ' ' << typeid (y).name () << endl; } template<typename R, typename T> R hum (T x) { R y; cout << "hum: " << typeid (x).name () << ' ' << typeid (y).name () << endl; return y; } void f1 (int x, int y) {} void f2 (double x, double y) {} int main (void) { int a, b; foo (a, b); // i i double c, d; bar (c, d); // d d ], f[]; foo (e, f); // Pc Pc bar (e, f); // A256_c A256_c // cout << sizeof (e) << endl; // 256 // char (*p)[256] = &e; // e[0] = 'C'; // *(e+0) = 'C' foo ("hello", "tarena"); // PKc PKc // bar ("hello", "tarena"); // A6_c A7_c bar<string> ("hello", "tarena"); // Ss Ss bar (string ("hello"), string ("tarena")); f1 (a, c); // c: double -> int f2 (a, c); // a: int -> double // int i = 1.2; // cout << i << endl; // 隐式推断的同时不能隐式转换 // foo (a, c); // c: double -> int, T=int // a: int -> double, T=double foo ((double)a, c); // d d foo (a, (int)c); // i i foo<double> (a, c); // d d foo<int> (a, c); // i i // a = hum (c); // 返回值的类型不参与隐式推断 a = hum<int> (c); // d i ; }
#include <iostream> #include <typeinfo> #include <cstring> using namespace std; // 两个任意类型值的最大值 template<typename T> T const& max (T const& x, T const& y) { cout << "<1" << typeid (x).name () << '>' << flush; return x < y ? y : x; } // 两个任意类型指针所指向目标的最大值 template<typename T> T* const& max (T* const& x, T* const& y) { cout << "<2" << typeid (x).name () << '>' << flush; return *x < *y ? y : x; } // 两个字符指针所指向字符串的最大值 char const* const& max (char const* const& x,char const* const& y) { cout << "<3" << typeid (x).name () << '>' << flush; ? y : x; } /* char const* max (char const* x,char const* y){ cout << "<3" << typeid (x).name () << '>' << flush; return strcmp (x, y) < 0 ? y : x; } */ // 三个任意类型值的最大值 template<typename T> T const& max (T const& x, T const& y, T const& z) { cout << "<4" << typeid (x).name () << '>' << flush; return ::max (::max (x, y), z); } /* // 两个字符指针所指向字符串的最大值 char const* const& max (char const* const& x,char const* const& y) { cout << "<3" << typeid (x).name () << '>' << flush; return strcmp (x, y) < 0 ? y : x; } */ int main (void) { , b = ; cout << ::max (a, b) << endl; cout << *::max (&a, &b) << endl; char const* c = "ab", *d = "abc"; cout << ::max (c, d) << endl; cout << ::max<> (c, d) << endl; cout << ::max<char const*> (c, d) << endl; char const* e = "abcd"; char const* const& f = ::max (c, d, e); cout << f << endl; "; ::max (g, h, i); cout << f << endl; ; }
C++STL - 函数模板的更多相关文章
- STL函数模板(即算法)一览
查找算法 adjacent_find:找出一个串中第一个不符合次序的地方 find,find_if:找出第一个符合条件的元素 find_first_of:在一个串中寻找第一个与另一个串中任意一个元素相 ...
- 仿stl+函数模板
#include<iostream> using namespace std; template<class T> void output(T begin, T end) { ...
- STL标准模板库介绍
1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...
- [Reprint] C++函数模板与类模板实例解析
这篇文章主要介绍了C++函数模板与类模板,需要的朋友可以参考下 本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程( ...
- c++函数模板声明与定义相分离
最近在仿写stl,发现stl源码中将模板的声明与定义写在一起实在很不优雅.自己尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义,然后在main函数里包含.h头文件,这样会报链接错误.这是因 ...
- c++的函数模板和类模板
函数模板和普通函数区别结论: 函数模板不允许自动类型转化 普通函数能够进行自动类型转换 函数模板和普通函数在一起,调用规则: 1 函数模板可以像普通函数一样被重载 2 C++编译器优先考虑普通函数 3 ...
- 读书笔记 effective c++ Item 45 使用成员函数模板来接受“所有兼容类型”
智能指针的行为像是指针,但是没有提供加的功能.例如,Item 13中解释了如何使用标准auto_ptr和tr1::shared_ptr指针在正确的时间自动删除堆上的资源.STL容器中的迭代器基本上都是 ...
- C++_进阶之函数模板_类模板
C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
- C++—模板(1)模板与函数模板
1.引入 如何编写一个通用加法函数?第一个方法是使用函数重载, 针对每个所需相同行为的不同类型重新实现这个函数.C++的这种编程机制给编程者极大的方便,不需要为功能相似.参数不同的函数选用不同的函数名 ...
随机推荐
- spring-boot - demo
当我发现把最初的一个demo整的面目全非的时候,突然想要找一个简单的demo做测试,发现与其在原来的上面该,还不如新建一个demo. 官方入门:http://projects.spring.io/sp ...
- Elasticsearch 全教程
Elasticsearch 权威指南 在线阅读 国外自动指向 GITBOOK 项目 | 国内用户自动指向 阿里云 GITHUB 仓库 译者前言 译者现在的工作项目中需要用到 Elasticsearch ...
- 利用Swashbuckle生成Web API Help Pages
利用Swashbuckle生成Web API Help Pages 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: ...
- Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室)
简介 ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端 ...
- Unity3D 5.x 简单实例 - 孤岛场景搭建
1,如果我们的Unity 5.X 是从这个地址下载的,安装后不会有资源包,则需要从Unity3D官网下载资源包: Standard Assets (Unity 5.x) 下载 下载后安装后,Unity ...
- [修正] iOS 10 使用相机及相簿闪退的问题修正
iOS 10 新规定,在取用相机,相簿,联络资讯,麦克风需要在 Version Info 加入指定的 key,否则闪退: 注:将下面的 Key 复制到工程 Option -> Version I ...
- 仿饿了点餐界面2个ListView联动
如图是效果图 是仿饿了的点餐界面 1.点击左侧的ListView,通过在在适配器中设置Item来改变颜色,再通过notifyDataSetInvalidated来刷新并用lv_home.setSele ...
- 【linux草鞋应用编程系列】_5_ Linux网络编程
一.网络通信简介 第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章. 二.linux网络通信 在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...
- 从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求
论职业的重要性 问:为什么所有家长都希望自己的孩子成为公务员? 答:体面.有权.有钱又悠闲. 问:为什么所有家长都希望自己的孩子成为律师或医生? 答:体面.有钱.有技能. 问:为什么所有家长都不怎么知 ...
- JavsScript+dom
JavsScript+dom DOM(兼容性) 用于操作文档树 1.帮助我们找到标签 直接查找 间接查找 getElementById getElementsByTageName 2.标签操作 内容: ...