jal*_*alf 15
真的,他们只是工作.它们使用模板的一些非常基本的属性,有时称为静态多态.如果你熟悉这个术语,它实质上是一种形式的鸭子.(如果它看起来像一只鸭子,它像鸭子一样嘎嘎叫,它一定是鸭子)
诀窍很简单.这是一个非常简单的例子:
template <typename T>
void say_hello(const T& t) {
t.hello();
}
Run Code Online (Sandbox Code Playgroud)
该say_hello
函数不关心其参数是哪种类型.它不必从接口派生出来,也不必做任何其他类型的"承诺".重要的是该类型在此上下文中起作用.我们所做的只是调用它的hello
函数.这意味着此代码将针对具有hello
成员函数的任何类型进行编译.
STL算法的工作方式类似.这是一个简单的实现std::for_each
:
template <typename iter_type, typename func_type>
void for_each(iter_type first, iter_type last, func_type f){
for (iter_type cur = first; cur != last; ++cur) {
f(*cur);
}
}
Run Code Online (Sandbox Code Playgroud)
只要模板类型符合它们的要求,此代码就会编译; iter_type
必须有预增量++ - 运算符.它必须有一个复制构造函数,它必须有!=运算符,并且必须有*-dereference-operator.
func_type
必须实现函数调用运算符,通过取消引用类型的对象来获取与您获得的相同类型的参数iter_type
.如果我for_each
使用满足这些要求的类型调用,代码将编译.iter_type
可以是任何满足这些要求的类型.代码中没有任何内容表示"这应该适用于矢量迭代器和列表迭代器以及映射迭代器".但只要向量,列表或映射迭代器实现我们使用的运算符,它就可以工作.
归档时间: |
|
查看次数: |
1399 次 |
最近记录: |