类模板的完全特例化和非完全特例化

有关类模板和函数模板的一些概念:

1、函数模板不支持模板参数给默认值(C99标准),类模板支持参数给默认值。

2、类模板有选择性实例化。

3、类中部分函数特例化时,一定要提供成员方法的模板。

4、成员方法的特例化不能在类外定义(语法不支持)。

5、类模板不能进行模板的实参推演,实参推演只针对函数模板。

6、出了编译器自动生成的成员函数之外,其他成员方法的模板完全可以代替普通的成员方法。


代码示例:

#include <iostream>
using namespace std;

//类模板
template<typename T>
class Test
{
public:
	void test()
	{
		cout << "Test::test" << endl;
	}
};

//完全特例化
template<>
class Test<char *>
{
public:
	void test()
	{
		cout << "Test<char *>::test" << endl;
	}
};

//提供针对指针的非完全特例化版本
template<typename T>
class Test<T*>
{
public:
	void test()
	{
		cout << "Test<T*>::test" << endl;
	}
};

//返回值void 带有一个类型为T类型的参数的函数指针 提供非完全特例化
template<typename E>
class Test<void(*)(E)>
{
public:
	void test()
	{
		cout << "Test<void(*)(E)::test" << endl;
	}
};

template<typename E>
class Test<void(E)>
{
public:
	void test()
	{
		cout << "Test<void(E)::test" << endl;
	}
};

void func1(int data)
{
	cout << "call func1" << endl;
}

void func2(double data)
{
	cout << "call func2" << endl;
}

void _cdecl pfunc3(int)
{
	cout << "call pfunc3" << endl;
}

int main()
{
	Test<int> t1;
	t1.test();

	Test<char *> t2;
	t2.test();

	Test<float *> t3;
	t3.test();

	Test<void(*)(int)> t4;
	t4.test();

	Test<void (int)> t5;
	t5.test();

	typedef void (*PFUNC)(int);//函数指针类型
	PFUNC pfunc = &func1;
	(*pfunc)(10);

	typedef void (PFUNC2)(int);//函数类型
	PFUNC2 *pfunc2 = &func1;
	(*pfunc2)(20);

	PFUNC2 pfunc3;
	pfunc3(10);

	return 0;
}

运行结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值