C++ template Day Day Up 第三天 模板函数的重载
2007-09-27 08:19
656 查看
从C++ templates粘一段例子下来:
[align=left]// maximum of two int values [/align]
[align=left]inline int const& max (int const& a, int const& b) [/align]
[align=left]{ [/align]
[align=left] return a<b?b:a; [/align]
[align=left]} [/align]
[align=left] [/align]
[align=left]// maximum of two values of any type [/align]
[align=left]template <typename T> [/align]
[align=left]inline T const& max (T const& a, T const& b) [/align]
[align=left]{ [/align]
[align=left] return a<b?b:a; [/align]
[align=left]} [/align]
[align=left] [/align]
[align=left]// maximum of three values of any type [/align]
[align=left]template <typename T> [/align]
[align=left]inline T const& max (T const& a, T const& b, T const& c) [/align]
[align=left]{ [/align]
[align=left] return max (max(a,b), c); [/align]
[align=left]} [/align]
[align=left] [/align]
[align=left]int main() [/align]
[align=left]{ [/align]
[align=left] ::max(7, 42, 68); // calls the template for three arguments [/align]
[align=left] ::max(7.0, 42.0); // calls max<double> (by argument deduction) [/align]
[align=left] ::max('a', 'b'); // calls max<char> (by argument deduction) [/align]
[align=left] ::max(7, 42); // calls the nontemplate for two ints [/align]
[align=left] ::max<>(7, 42); // calls max<int> (by argument deduction) [/align]
[align=left] ::max<double>(7, 42); // calls max<double> (no argument deduction) [/align]
[align=left] ::max('a', 42.7); // calls the nontemplate for two ints [/align]
}
恩,这个例子浅显易懂,可以根据它看出来编译器的推断规则。
重要的是看下面这个例子:
[align=left]template<typename T>[/align]
[align=left]void fun(T* t)[/align]
[align=left]{[/align]
[align=left] cout<<"fun with pointer/n";[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]template<typename T>[/align]
[align=left]void fun(T t)[/align]
[align=left]{[/align]
[align=left] cout<<"fun normal/n";[/align]
}
// main
int i = 5;
fun(&i); //[a]
fun(i); //[b]
[a]和[b]分别输出:
fun with pointer
fun normal
这说明可以根据模板参数来区分参数的类型,这也依赖于deduction。
例如可以通过下面的代码来检验一个类型是否为指针。
[align=left]template<typename T>[/align]
[align=left]struct IsPointer[/align]
[align=left]{[/align]
[align=left] enum{ Result = false };[/align]
[align=left]};[/align]
[align=left] [/align]
[align=left]template <typename T>[/align]
[align=left]struct IsPointer<T*>[/align]
[align=left]{[/align]
[align=left] enum{ Result = true };[/align]
};
这是编译期便能够算出结果的。
[align=left]// maximum of two int values [/align]
[align=left]inline int const& max (int const& a, int const& b) [/align]
[align=left]{ [/align]
[align=left] return a<b?b:a; [/align]
[align=left]} [/align]
[align=left] [/align]
[align=left]// maximum of two values of any type [/align]
[align=left]template <typename T> [/align]
[align=left]inline T const& max (T const& a, T const& b) [/align]
[align=left]{ [/align]
[align=left] return a<b?b:a; [/align]
[align=left]} [/align]
[align=left] [/align]
[align=left]// maximum of three values of any type [/align]
[align=left]template <typename T> [/align]
[align=left]inline T const& max (T const& a, T const& b, T const& c) [/align]
[align=left]{ [/align]
[align=left] return max (max(a,b), c); [/align]
[align=left]} [/align]
[align=left] [/align]
[align=left]int main() [/align]
[align=left]{ [/align]
[align=left] ::max(7, 42, 68); // calls the template for three arguments [/align]
[align=left] ::max(7.0, 42.0); // calls max<double> (by argument deduction) [/align]
[align=left] ::max('a', 'b'); // calls max<char> (by argument deduction) [/align]
[align=left] ::max(7, 42); // calls the nontemplate for two ints [/align]
[align=left] ::max<>(7, 42); // calls max<int> (by argument deduction) [/align]
[align=left] ::max<double>(7, 42); // calls max<double> (no argument deduction) [/align]
[align=left] ::max('a', 42.7); // calls the nontemplate for two ints [/align]
}
恩,这个例子浅显易懂,可以根据它看出来编译器的推断规则。
重要的是看下面这个例子:
[align=left]template<typename T>[/align]
[align=left]void fun(T* t)[/align]
[align=left]{[/align]
[align=left] cout<<"fun with pointer/n";[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]template<typename T>[/align]
[align=left]void fun(T t)[/align]
[align=left]{[/align]
[align=left] cout<<"fun normal/n";[/align]
}
// main
int i = 5;
fun(&i); //[a]
fun(i); //[b]
[a]和[b]分别输出:
fun with pointer
fun normal
这说明可以根据模板参数来区分参数的类型,这也依赖于deduction。
例如可以通过下面的代码来检验一个类型是否为指针。
[align=left]template<typename T>[/align]
[align=left]struct IsPointer[/align]
[align=left]{[/align]
[align=left] enum{ Result = false };[/align]
[align=left]};[/align]
[align=left] [/align]
[align=left]template <typename T>[/align]
[align=left]struct IsPointer<T*>[/align]
[align=left]{[/align]
[align=left] enum{ Result = true };[/align]
};
这是编译期便能够算出结果的。
相关文章推荐
- C++ template Day Day Up 第二天 模板参数推论(deduction)
- C++ template Day Day Up 第一天 模板编译模式
- C++ template Day Day Up 第二天 模板参数推论(deduction)
- c++ 调用模板函数时加template什么意思?
- c++ template笔记(1)模板函数
- 【C++】member template function 成员模板函数
- Power up C++ with the Standard Template Library: Part 1
- C++ class template中,重载输出运算符(<<)的方法
- 【重温C/C++】explicit+||template||virtual虚函数||重载和重写
- C++ 函数模板(十四)--template 泛型函数模板、通用函数、重载模板
- Power up C++ with the Standard Template Library:Part II: Advanced Uses [翻译]
- C++ Template 特化与重载
- C++ - 函数模板(function template) 的 重载(overload) 详解 及 代码
- C++ - 函数模板(function template) 的 重载(overload) 详解 及 代码
- c++ template笔记(1)模板函数
- Power up C++ with the Standard Template Library: Part I[翻译]
- C++ template模板函数的定义与调用
- c++ template笔记(1)模板函数
- c++之——template模板函数
- c++中模板函数和非模板函数的重载