首页 > 其他分享 >模板:函数模板

模板:函数模板

时间:2022-09-29 23:34:08浏览次数:47  
标签:const 函数 int template return parameter 模板

1 模板的基础知识

1.1 模板的参数

Template Parameter vs Template Arguments
在技术文献中:parameter翻译成形参(format parameter), argument翻译成实参(actual parameter).

A type parameter can be used to name the return type or a function parameter type, and for variable declarations or casts inside the function body. Each type parameter must be preceed by the keyword typename .

点击查看代码
template <typename T> T foo(T* p) {
    T tmp = *p;
    // ...
    return tmp;
}

// error: must precede U with either typename or class
template <typename T, U> T calc(const T&, const U&);

模板除了可以有类型参数(type parameter),还可以有非类型参数(non-type parameter).

A template nontype parameter is a constant value inside the tempalte definition. A nontype parameter can be used when constant expressions are required, for example, to specify the size fo an array.

点击查看代码
template < unsigned N, unsigned M>
int compare(const char (&p1)[N], const char (&p2)[M]) {
    return strcmp(p1, p2);
}
// 如果调用函数如下
compare("hi", "mom");
// 该模板函数会被实例化下面这个函数
int compare(const char (&p1)[3], const char (&p2)[4]) { ... }

1.2 模板的分类

  • function template 函数模板 (recipes for making functions)
  • class templates 类模板 (recipes for making classes)
  • member function templates 成员函数模板(recipes for making member functions of classes)
  • alias templates (C++ 11引入) 别名模板(recipes for making type aliases)
  • variable templates(C++ 14引入) 变量模板(recipes for making variables or static data members)
  • lambda templates (C++ 20引入)
    image

A template is not a thing —— it is a recipe for making things.

2 模板的特化(specialization)

The concrete entity resulting from substituting template arguments for template parameters is a specialization.

image

image

下面给几个函数模板特化(Expliciit Specialization)、Implicit Instantiation和Explicit Instantiation的例子。(类模板才有偏特化[Partial Specialization])

点击查看代码
template<typename T>
T const& min(T const&a, T const& b) {
	return (b < a) ? b : a;
}

// Explicit Specialization
template<>
int const& min(int const& a, int const& b) {
	return (b - 10 < a) ? b : a;
}

double d1 = 2.78;
double d2 = 3.14
// Implicit Instantiation
double d3 = min<double>(d1, d2);
// Implicit Instantiation
double d4 = min(d1, d1)
点击查看代码
#include <iostream>
#include <string>


template<typename T>
T MyMin(const T& a, const T& b) {
    return (a < b) ? a : b;
}

// Explicit Specialization
template<>
double MyMin(const double& a, const double& b) {
    return 0.112;
}

// Explicit Instantiation
template int MyMin(const int& a, const int& b);

int main() {
    int a = 3;
    int b = 4;
    float x = 1.2;
    float y = 1.1;
    double m = 1.200;
    double n = 2.100;
    std::cout << MyMin(a, b) << std::endl;
    std::cout << MyMin(x, y) << std::endl;
    std::cout << MyMin(m, n) << std::endl;

	// Implicit Instantiation
    std::string s1 = "hello";
    std::string s2 = "world";
    std::cout << MyMin(s1, s1) << std::endl;
    return 0;
}
相比Implicit Instantiation, Explicit Instantiation可以加快编译速度。 参考资料: [《cppreference: Function Template》](https://en.cppreference.com/w/cpp/language/function_template "《cppreference: Function Template》")

3 函数的默认参数

点击查看代码
#include <iostream>
#include <string>

// Function Declaration
int myadd(int a = 2, int b = 3);
int mysub(int a = 6, int b = 3);

// Function Definition

// OK
int myadd(int a, int b) {
    return a + b;
}

// Error
int mysub(int a = 6, int b = 3) {
    return a - b;
}

int main() {
    int x = 10;
    int y = 5;
    std::cout << myadd(x, y) << std::endl;
    std::cout << mysub(x, y) << std::endl;
    return 0;
}

标签:const,函数,int,template,return,parameter,模板
From: https://www.cnblogs.com/TaipKang/p/16743204.html

相关文章

  • 箭头函数与普通函数的区别
    一、声明方式不同声明一个普通函数需要使用关键字function来完成,并且使用function既可以声明成一个具名函数也可以声明成一个匿名函数声明一个箭头函数则只需要使用箭......
  • 【模板】BM字符串匹配
    据说效率是KMP的\(3\sim4\)倍。主要利用坏字符和好后缀进行跳转来避免过多的匹配。这篇博客讲的很好,推荐大家看看。#include<iostream>#include<vector>#incl......
  • 网络字节序与主机字节序的转换函数实践
    网络字节序:网络字节序,是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big......
  • 有趣的函数
    #include<stdio.h>intmain(){printf("%d",printf("%d",printf("%d",43)));}结果如图所示为什么是4321那?此题涉及两个知识1.回调函数2.printf的返回值要知道先执行再......
  • 指数族函数
    指数族函数待完善作者查阅了一些资料,全是公式函数名也陌生,所以这部分一直进行不下去。其实不用怕,只是提出了一类分布,这一类分布遵循着一些性质,具体推导过程甚至可以不了......
  • 模板建立
    模板建立步骤如果还没有建立一个组存储自己的模板,则先选择2(红框处)然后取个名字就好如果已经有组了,在自己建立的组内添加新模板1:后续快速生成使用的代码2:......
  • 鱼传科技:函数计算,只要用上就会觉得香
    简介: 复杂交互小程序如何应对访问量激增?深圳鱼传科技有限公司是专注以精准营销和互联网生态产品运营为核心的综合互联网营销推广服务商。通过整合全网优质媒体......
  • python使用win32api进行后台窗口的部分截图函数
    defwindow_capture_beat(hwnd,stayx:int,endx:int,stay:int,endy:int):hwndDC=win32gui.GetWindowDC(hwnd)mfcDC=win32ui.CreateDCFromHandle(hwndDC)......
  • python 生成伪随机数函数 random
    """random函数:出一个伪随机数具体怎么做?一般我们会考虑先查找python官方自带的文档在IDLE的右上角点击HELP-->PythonDoc(F1)-->点击左上角的索引-->输入我们要......
  • 多种群遗传算法的函数优化算法(附MATLAB代码)
    最近小编终于重新拿起智能优化算法的圣经《MATLAB智能算法30个案例分析(第2版)》,每次读这本书都会有新的收获,今天要与大家分享的智能算法是多种群遗传算法。PS:文中代码来源于......