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++的这种编程机制给编程者极大的方便,不需要为功能相似.参数不同的函数选用不同的函数名 ...
随机推荐
- js构建ui的统一异常处理方案(三)
笔者之前分析了如何实现js的责任链异常处理的方法,通过promise这个异步模型,我们能够对同步方法和异步方法的两种情况,均可以实现责任链模式.有了这些武器,我们就可以开始设计ui的统一异常处理方案了 ...
- 不在 sudoers 文件中。此事将被报告。
使用Linux,初学使用root不要太方便,工作中却不会给你这样的,必须要用自己的账号.新账号需要添加sudo的权限. su 使用root登陆 visudo 在root下添加自己的用户名 root A ...
- JAVA常见面试题之Forward和Redirect的区别
用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的.根据转发方式的不同,可以区分为直接请求转发 ...
- [函数] Delphi FMX Windows 取得下载 Downloads 目录
在 Firemonkey 提供了一个跨平台的函数 TPath.GetDownloadsPath 来取得该平台的下载目录,但是非常奇怪的是,在 Windows 平台下,取得的下载目录确是: C:\Use ...
- FTP工具类开发
正所谓工欲善其事必先利其器,熟悉了下一套流程,以此铭记. 1.FTP服务搭建 由于本人使用wondiow系统,所以针对window的童鞋们可以查看.至于windowX这里配置类似,所以不要纠结于win ...
- SQL性能优化常见措施(Lock wait timeout exceeded)
SQL性能优化常见措施 目 录 1.mysql中explain命令使用 2.mysql中mysqldumpslow的使用 3.mysql中修改my.ini配置文件记录日志 4.mysql中如何加索引 ...
- 用python来个百度关键词刷排名脚本
目的:写个脚本来提升百度排名 我一个seo届前辈的朋友找我,他说,seo事无巨细,自己主观方面能做的几乎都能做了,提升百度等搜索引擎中的排名往往效果不佳或者起效周期慢.能不能人为去干预下呢? 获得排名 ...
- 如何在Mac OSX系统下安装Tomcat
1. 下载Tomcat(地址:tomcat.apache.org),选择适合的版本(这里选择6.0.35),点击"Download",之后在新页面点击"Core下的&qu ...
- 《More Effective C#》读书笔记
<More Effective C#>这本书,大概是四年前看完的,但只整理了一部分读书笔记,后面有时间的话,会陆续补充的. More Effective C# :使用泛型 More Eff ...
- jQuery实现checkbox反选(转载)
//反选 $("#btnInvert").click(function () { //1.方法一实现反选 $("#chk input:checkbox").ea ...