C++ - 成员函数(member function)模板(template) 详解 及 代码

成员函数(member function)模板(template) 详解 及 代码

 

本文地址: http://blog.csdn.net/caroline_wendy/article/details/16918085

 

成员模板(member template) 既可以在普通类(ordinary class), 也可以在类模板(class template);

在普通类中, 在使用成员函数时, 不用提供模板参数, 函数可以根据使用的参数,

自动推导(deduce)模板实参(template argument)对应模板形参(template parameter);

在类模板中, 成员函数的模板参数(template parameter)可以和类的模板参数不同, 但在定义(definition)中,

必须添加两个模板参数列表(template parameter list), 第一个为类的, 第二个为成员函数的;

代码如下:

/*
 * cppprimer.cpp
 *
 *  Created on: 2013.11.24
 *      Author: Caroline
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <functional>
#include <memory>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <iterator>

//函数模板默认参数
template <typename T, typename F = std::less<T>>
int compare (const T &v1, const T &v2, F f = F())
{
	if (f(v1, v2)) return -1;
	if (f(v2, v1)) return 1;
	return 0;
}

class DebugDelete {
public:
	DebugDelete (std::ostream &s = std::cerr) : os (s) { }
	template <typename T> void operator() (T *p) const {
		os << "deleting unique_ptr" << std::endl; delete p;
	}
private:
	std::ostream &os;
};

template <typename T> class Blob {
public:
	template <typename It> Blob (It b, It e);
	/*template <typename It> Blob (It b, It e) {
		std::sort(b, e);
	}*/
};

template <typename T>
template <typename It>
Blob<T>::Blob (It b, It e) {
		std::sort(b, e); //容器需要允许被排序
}

int main (void) {

	std::cout << "compare (0, 42) = " << compare (0, 42) << std::endl;

	double* p = new double;
	DebugDelete d;
	d(p); //使用时, 可以自动推倒模板
	int* ip = new int;
	DebugDelete() (ip);
	std::unique_ptr<int, DebugDelete> pi (new int, DebugDelete());
	std::unique_ptr<std::string, DebugDelete> ps (new std::string, DebugDelete());

	int ia[] = {9, 8, 7, 6, 5};
	std::vector<long> vi = {5, 4, 3, 2, 1, 0};
	std::deque<std::string> w = {"lady", "girl", "woman", "now"};

	Blob<int> a1(std::begin(ia), std::end(ia));
	Blob<int> a2(vi.begin(), vi.end());
	Blob<std::string> a3(w.begin(), w.end());

	std::cout << "int ia[] = ";
	for (const auto i : ia) { std::cout << i << " "; }
	std::cout << std::endl;
	std::cout << "std::vector<long> vi = ";
	for (const auto i : vi) { std::cout << i << " "; }
	std::cout << std::endl;
	std::cout << "std::list<const char*> w = ";
	for (const auto i : w) { std::cout << i << " "; }
	std::cout << std::endl;

	return 0;

}


输出:

deleting unique_ptr
deleting unique_ptr
deleting unique_ptr
deleting unique_ptr
compare (0, 42) = -1
int ia[] = 5 6 7 8 9 
std::vector<long> vi = 0 1 2 3 4 5 
std::list<const char*> w = girl lady now woman 



  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CarolineSpike

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值