C++ - 成员函数(member function)模板(template) 详解 及 代码
2013-11-24 12:31
836 查看
成员函数(member function)模板(template) 详解 及 代码
本文地址: /article/1384287.html成员模板(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
本文出自 “永不言弃” 博客,请务必保留此出处http://spikeking.blog.51cto.com/5252771/1387999
相关文章推荐
- C++ - 成员函数(member function)模板(template) 详解 及 代码
- C++ - 函数模板(function template) 的 重载(overload) 详解 及 代码
- C++ - 函数模板(function template) 的 重载(overload) 详解 及 代码
- C++ - 函数模板定制(function template specialization) 详解 及 代码
- C++ - 函数模板定制(function template specialization) 详解 及 代码
- C++ - 函数模板(function template) 详解
- C++ - 函数模板(function template) 详解
- 成员函数(member function)模板(template) 详解 及 代码
- C++ Template中关于模板类的成员模板函数显示实例化的问题
- member template成员模板笔记----C++学习之路
- Member Function Pointers and the Fastest Possible C++ Delegates - 成员函数指针与高性能的C++委托
- C++ 成员函数指针的问题 pointer-to-member-function
- 【C++】member template function 成员模板函数
- 【C++】深度探索C++对象模型之虚拟成员函数(virtual member function)
- C++ - 模板类使用成员函数模板(member function template)处理隐式(implicit)转换
- C++ - 函数模板(function template)返回值
- C++ - 函数模板(function template) 的 推进(forward) 问题 及 解决
- C++ - 函数模板(function template)返回值
- C++ - 函数模板(function template)右值引用参数 问题 及 解决
- C++ - 函数模板(function template) 的 推进(forward) 问题 及 解决