c ++テンプレートスキルの基本的な知識

技術の基礎

キーワードtypename

#include "pch.h"
#include <iostream>
#include<string>
using namespace std;

class U
{
    
    
public:
	U():i(100)
	{
    
    
		cout << "U()" << endl;
	}
public:
	/*在类U里声明一个静态int类型变量*/
	static int sub;
	/*无符号整型重定义*/
	typedef unsigned int UINT4; 

	UINT4  i;
};
/*类外定义静态变量*/
int U::sub = 100;

template<typename T>
class A
{
    
    
private:
	int p;
public:
	A():p(10)
	{
    
    
		cout << "A()" << endl;
	}	
public:
	//typename U::UINT4  *r = NULL;
	void func1()
	{
    
    
		U u;
		/*这句话的意思是说,U::UINT4是一个类型,也就是说,typename后面接的是
		一个类型,而U::UINT4则代表的是,U是一个类,UINT4是类里的一个数据类型,
		所以,这句话的意思就是,定义了一个指针p,它的类型是U::UINT4*/
		typename U::UINT4  *q = NULL;

		q = &u.i;
		*q = 22;

		cout << u.i << endl;  //22
	}
	void func2()
	{
    
    
		 int ret = 0;
		 /*如果没有typename,那么U::sub * p就会被看作是
		 类U里面的静态成员变量(因为是以::访问,所以会被
		 看作是静态成员变量)乘以p*/
		 ret = U::sub  * p;
		 cout << ret << endl;  //1000
	}
};
int  main()
{
    
    
//一:关键字typename
	/*
	概述:在c++标准化过程中,引入关键字typedef是为了说明,模板内部的标识符可以是一个类型,来看一个稍微复杂点的例子来理解一下:
*/
	A<int>  obj;
	obj.func1();
	obj.func2();
	return 0;
}

これを使って


メンバーテンプレート

template<typename T>
class B
{
    
    
public:
	T a;
public:
	B():a(10)
	{
    
    
		cout << "B()" << endl;
	}
public:
	/*template<typename U>
	B<T>& operator= (const B<U>& op)
	{
		a = op.a;
		return *this;
	}
*/
	/*成员函数模板的类里声明*/
	template<typename K>
	void sum();
};

/*成员函数模板的类外定义*/
template<typename T>
template<typename K>
void B<T>::sum()
{
    
    
	K j = K();
	cout << a + j << endl;
}

B<int> obj1;
B<float> obj2;
obj2.sum<float>();

テンプレートパラメータ

初期化ゼロ


関数テンプレートの引数として文字列を使用する


おすすめ

転載: blog.csdn.net/qq_38158479/article/details/114447858