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++的这种编程机制给编程者极大的方便,不需要为功能相似.参数不同的函数选用不同的函数名 ...
随机推荐
- 学习php中的正则表达式,PHP正则表达式基础
语法格式:位于定界符"/"之间. 较为常用的元字符包括: “+”, “*”,以及 “?”. 其中, “+”元字符规定其前导字符必须在目标对象中连续出现一次或多次, “*”元字符规定 ...
- 【Python实战】机型自动化标注(搜狗爬虫实现)
1. 引言 从安卓手机收集上来的机型大都为这样: mi|5 mi|4c mi 4c 2014022 kiw-al10 nem-tl00h 收集的机型大都杂乱无章,不便于做统计分析.因此,标注显得尤为重 ...
- SignalR的Javascript客户端API使用方式整理
SignalR的服务端提供了两种实现方式,分别是PersistentConnection和Hub,这两种方式的侧重点不同: PersistentConnection更接近于底层,编程接口比较简单,传输 ...
- SQL Server时间粒度系列----第7节日历数据表详解
本文目录列表: 1.时间粒度有关描述 2.时间维度有关功能函数3.日历数据表 4.日历数据表数据填充 5.总结语 6.参考清单列表 时间粒度有关描述 将该系列涉及到的时间粒度以及分钟以下的粒度 ...
- C++异常处理: try,catch,throw,finally的用法
写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...
- WP7 手机软件纪念 - 稍后读软件
在本月换机之际,决定写篇博客纪念一下我在 WP7 手机上开发的一个稍后读软件.这个工具开发完成后,两年间,我的 WP7 手机 80% 的用途,都发挥在了它身上. 这个软件其实是一个离线阅读工具,非常类 ...
- ASP.NET MVC入门之再不学习就真的out了
听说最近又出了什么SAM,MVC辉煌即将过去,惊了我一身冷汗,ASP.NET MVC是啥都还没搞明白呢 于是赶紧打开ASP.NET官网学习学习,欢迎各位高手大侠来指点指点
- autocad2008+C#2008开发中设置自动加载dll
一.复制编译后的dlll路径,比如我的是D:\zjy\cad开发\学习\宗地图\bin\Debug\zd.dll 二.随便找个地方新建一个记事本,在记事本中写入以下内容: (command " ...
- C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》
C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...
- 能力素质模型咨询工具(Part1)
之前写过由企业家基本素质想到的文章,里面提及一些能力与素质,以下有内容也可以参考: 领导职位 表6-1 远见卓识的行为表现 级 别 行 为 表 现 A (1)关注行业的前景和环境的变化, ...