函数模板知识点

函数模板–缺省参数

#include <iostream>
#include <list>
#include <map>
#include <string>

using namespace std;

namespace _nmsp1
{
	int mf(int tmp1, int tmp2)
	{
		return 1;
	}
	int mf2(int tmp1, int tmp2)
	{
		return 10;
	}
	typedef int(*FunType)(int,int);
	template<typename T,typename F=FunType>
	void testfunc(T i, T j, F funcpoint = mf)
	{
		cout << "void testfunc(T i, T j, F funcpoint = mf):"<<funcpoint(i,j) << endl;
	}

	template<typename T=int,typename U>
	void testfunc2(U m)
	{
		T tmpvalue = m;
		cout << tmpvalue << endl;
	}
}

int main()
{

	_nmsp1::testfunc(15,16); // 返回1
	_nmsp1::testfunc(15, 16,_nmsp1::mf2); //不用缺省的类型,返回10
	_nmsp1::testfunc2(12);


	return 0;
}

函数模板–非类型模板参数

基本概念

  1. 前面的函数模板设计到的模板参数都是 “类型 模板参数” 需要用 typename(class)来修饰。
  2. 模板参数还可以是 “非类型 模板参数(普通的参数)”,常用的就是给一个数字作为默认值,而不是一个默认类型。
  3. 从C++17开始,支持非类型模板参数为auto类型。指定非类型模板参数的值时,一般给定都是常量。因为编译器在编译的时候,就要能够确定非类型模板参数的值。
  4. 并不是任何类型的参数都可以作为非类型模板参数。int类型可以,但double、float、string、自定义类类型都不行。现在是不可以,不代表以后的编译器就不可以。但是double* 这种类型可以。
  5. 一般允许做非类型模板参数的类型如下:可能不断增加。a) 整形或者枚举型 b) 指针类型 c) 左值类型,引用类型 d) auto 或者 decltype(auto); e) 可能还有其他类型。
#include <iostream>
#include <list>
#include <map>
#include <string>

using namespace std;

namespace _nmsp2
{
	//template <typename T,typename U,int val=100> //与下面的写法等价
	template <typename T, typename U, auto val = 100>
	auto Add(T tv1, U tv2)
	{
		return tv1 + tv2+val;
	}

    template <double* p>
    void mft()
    {
        cout<<"call void mft()"<<endl;
    }
    double g_d=1.3; //
}

int main()
{
	cout << _nmsp2::Add<float,float>(22.3f,11.8f) << endl; //使用默认缺省值100
	cout << _nmsp2::Add<float, float,800>(22.3f,11.8f) << endl; //使用显示指定的值800

    _nmsp2::mft<&_nmsp2::g_d>();


	return 0;
}

奇怪的写法

  1. 不管类型还是非类型模板参数,如果代码中没有用到,则参数名可以省略。
  2. 类型前面可以增加一个 typename修饰以明确标识一个类型。一般与模板的情况下,需要在前面增加一个 typename修饰来明确一个类型
#include <iostream>
#include <list>
#include <map>
#include <string>

using namespace std;


namespace _nmsp3
{
    //template <typename T,int value>
    //template <typename,typename int> //在int前面加一个 typename 表示int 为一个类型,有些多此一举。
    template <typename,int> //因为Add2()没有用到类型模板参数T,和非类型模板参数value,所以可以采用这种写法
    auto Add2()
    {
        return 100;
    }
}

int main()
{
	cout<<_nmsp3::Add2<int,45>()<<endl;

	return 0;
}
posted @ 2022-12-30 17:47  repinkply  阅读(39)  评论(0)    收藏  举报