C++ 模板
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>。

可以使用模板来定义函数和类。

函数模板
模板函数定义的一般形式如下所示:

template <typename type> ret-type func-name(parameter list)
{
   // 函数的主体
}
type 是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。

#include <windows.h>
#include "resource.h"
#include <string>using namespace std;LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst;
TCHAR szClassName[] = TEXT("tempDemo");template <typename T>
inline T const& Max (T const& a, T const& b)
{ return a < b ? b:a;
} int WINAPI
WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
{HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_TEMPDEMO1);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("C++函数模板Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,200,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam;
}LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;RECT rt;    char dstr[20];char szBuffer[100];   int i = 99;int j = 60;double f1=17.98;double f2=77.09;string s1 = "Hello"; string s2 = "World";switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_temp:        hdc=GetDC(hwnd);wsprintf(szBuffer, "Max(i, j): %d",Max(i, j));TextOut(hdc,80,30,szBuffer,lstrlen(szBuffer));//cout << "Max(f1, f2): " << Max(f1, f2) << endl;sprintf(dstr,"%.2lf",Max(f1, f2));wsprintf(szBuffer, "Max(f1, f2): %s",dstr);TextOut(hdc,80,60,szBuffer,lstrlen(szBuffer));wsprintf(szBuffer, "Max(s1, s2): %s",(Max(s1, s2)).c_str());TextOut(hdc,80,90,szBuffer,lstrlen(szBuffer));break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("tempDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("tempDemo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam);              }break;case WM_CREATE:break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);                 GetClientRect(hwnd, &rt);               EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0;
}

运行;

这里还有一个问题;

第三次是比较两个字符串的大小;代码为:

wsprintf(szBuffer, "Max(s1, s2): %s",(Max(s1, s2)).c_str());

对于Max返回的string再调用c_str()函数;不如此,将出现错误:

cannot pass objects of non-POD type `const struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >' through `...'; call will abort at runtime

因为;

1 printf函数输出字符串是针对char *的,即printf只能输出c语言的内置数据类型,而string不是c语言的内置数据类型。
2 string类型的对象不止包含字符串,还包含了许多用于操作的函数,所以&str并非字符串的首地址。
3 如需输出string对象中的字符串,可以使用string的成员函数c_str(),该函数返回字符串的首字符的地址。

可参阅;

https://blog.csdn.net/li_l_il/article/details/84196587

工程;

资源文件,头文件;

#include "resource.h"
#include <windows.h>/
//
// Menu
//IDC_TEMPDEMO1 MENU
BEGINPOPUP "&File"BEGINMENUITEM "C++ 函数模板Demo",                   IDM_tempMENUITEM "E&xit",                 IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...",             IDM_ABOUTEND
END
#define  IDM_EXIT        10001
#define     IDM_ABOUT       10002#define    IDC_TEMPDEMO1       10101
#define     IDD_ABOUTBOX    10102
#define     IDM_temp     40001

C++函数模板Demo - win32 版相关推荐

  1. C++最小函数模板demo

    #include <iostream> //函数模板 格式:template <typename/class 定义的新类型/T> T/返回类型 (T/参数类型 a, T b); ...

  2. C语言回调函数Demo - Win32版

    回调函数:通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件 ...

  3. C++ 异常处理Demo - win32 版

    throw关键字用来抛出一个异常,这个异常会被 try 检测到,进而被 catch 捕获. 异常既然是一份数据,那么就应该有数据类型.C++ 规定,异常类型可以是 int.char.float.boo ...

  4. C++ 引用 Demo - Win32 版

    一 引用 C/C++ 禁止在函数调用时直接传递数组的内容,而是强制传递数组指针. 对于结构体和对象没有这种限制,调用函数时既可以传递指针,也可以直接传递内容. 在 C++ 中,有一种比指针更加便捷的传 ...

  5. win32 临界区和简单实例Demo(win32版)

    一 win32 临界区 临界区是一种防止多个线程同时执行一个特定代码段的机制.如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他的所有试图访问此临界区的线程将被挂起,并且一直持续到进入临界区 ...

  6. 函数模板(参考《C++ Templates 英文版第二版》)

    C++模板编程(参考<C++ Templates 英文版第二版>) Chapter 1 函数模板 1.1 一窥函数模板 template<class T> T max(T a, ...

  7. C++ TGP 模板基础知识--01函数模板

    基本范例 模板的定义是以template关键字开头 类型模板参数T前面用typename来修饰,所以遇到typename就知道其后面跟的是一个类型,typename可以用class取代 类型模板参数T ...

  8. C++ 函数模板特化导致的多重定义链接错误

    转载请注明文章:C++ 函数模板特化导致的多重定义链接错误 出处:多客博图 标题说的可能不是很清楚,解释一下,函数模板,一般都是放在头文件里面,所以有些时候,我也会做一个特化,也放在这个头文件里面,当 ...

  9. 什么是函数模板以及什么是类模板

    [1]模板的含义 (1) 模板就是实现代码重用的机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性. (2) 模板可以分为两类,一个是函数模板,另外一个是类模板. ...

最新文章

  1. C++ delete 和 delete []的区别
  2. ssh证书登录(实例详解)
  3. 【Python】if __name__ == ‘__main__‘:的作用和原理
  4. 牛客网-剑指offer 第一题(二维数组中的查找)
  5. android新年祝福代码,讯飞输入法发布Android新春版 Biu一下敲出美好祝愿!
  6. Docker介绍及安装
  7. python搭建环境的心得体会_python学习第一天_环境的搭建
  8. epoch如何设置_Kaggle竞赛硬件如何选择?不差钱、追求速度,那就上TPU吧
  9. C++标准转换运算符:static_cast
  10. Where does the error come from?----Bias and Variance
  11. Linux 动、静态库原理深剖
  12. 【一键安装+Docker】无视系统,十几个ROS版本任你选择
  13. 陕西计算机在职研究生院校排名,陕西在职研究生哪个学校好上
  14. 麦吉尔 计算机科学学分,麦吉尔大学计算机
  15. 隐马尔科夫模型 python 实现简单拼音输入法
  16. 《Windows 8 权威指南》——2.4 Aero与Metro的触摸对比
  17. 黑崎一护为什么没有和朽木露琪亚在一起
  18. element 前端布局理解经验及好用的属性
  19. 那些好用的无版权免费图片网站
  20. 物联网还有哪些创业机会?

热门文章

  1. Tensorflow 模型加载及部分变量初始化
  2. linux C库编译
  3. 差分法c语言源程序,差分法求数据压缩
  4. python中迭代器的实现原理_Python 进阶应用教程
  5. 彻底搞懂JS无缝滚动代码
  6. Windows 技术篇-减少对视频相关服务的cpu分配,减少cpu占用率
  7. MRCTF2020]你传你码呢
  8. CTFshow 反序列化 web262
  9. CTFshow php特性 web126
  10. 10.1 分别通过函数和重载运算符来实现复数相加