C++模板中的函数对象

在C++模板类map中一个参数为Compare类型,该类型为一个比较函数,其完整定义如下:

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class map;

函数作为类进行传递,该类采用了重载操作符()来实现函数指针到类的转变。在实际中也可以仿照此风格写自己的类。

 1 template <typename Key, typename Value, class Hash >
 2 class A     {
 3     Hash hash_fn;
 4 public:
 5     A():hash_fn(Hash()) {
 6
 7     }
 8
 9     size_t hashCode(Key key) { return hash_fn(key);}
10
11 };

第三个参数Hash为函数对象,该对象通过重载操作符()来实现,其一个字符串类型的Key定义如下:

1 struct str_hash {
2     size_t operator()(const std::string& str) const
3     {
4         return 0;
5     }
6 };

当调用hash_fn(key)函数时,该重载函数被调用,这样就实现了转换。由于C++标准库中包含有大量此类型风格的类,我们就可以通过默认参数来调用标准类,这样上面的模板类A就可以定义如下:

template <typename Key, typename Value, class Hash = std::hash<Key>>

测试程序如下:

 1 int main(int argc, char *argv[]) {
 2
 3     A<std::string , int, str_hash> a;
 4     std::cout << "hashCode:" << a.hashCode("abc") << std::endl;
 5
 6     A<std::string,int,std::hash<std::string>> h;
 7     std::cout << h.hashCode("abc") << std::endl;
 8
 9     A<std::string,int> h2;
10     std::cout << h.hashCode("abc") << std::endl;
11
12     return 0;
13 }

测试结果如下:

1 functiontem
2 hashCode:0
3 3350977461
4 3350977461
时间: 2024-11-05 10:26:29

C++模板中的函数对象的相关文章

C++中的函数对象(一)

STL中的函数对象,大多数STL类属算法(以及某些容器类)可以以一个函数对象作为参数.引入函数对象的目的是为了使算法的功能富于变化,从而增强算法的通用性. 所谓函数对象,是指一段代码实体,它可以不带参数,也可以带有若干参数,其功能是获得一个值,或者改变操作的状态.在C++编程中,任何普通的函数都满足这个定义,而且,任何一个重载了运算符operator()的类的对象也都满足这一定义,称为函数对象. 普通函数 int multfun(int x, int y) { return x*y; } 或者下

C++手稿:STL中的函数对象与函数指针

先来感受一下C++中的函数对象和函数指针: template<typename T> void printer(int a, int b, T func){ cout<<func(a, b)<<endl; } 在STL中定义了很多像上面这样的模板,这里的T是一个可调用(实现了括号运算符)的东西. 这使得我们在使用模板时可以指定一个计算策略,它可以是函数对象,也可以是函数指针. Less<int>便是一个常见的函数对象,常用来配置容器或算法.<funct

thinkphp模板中使用函数的方法

1.执行函数并输出返回值:格式:{:function(-)} 例如,输出U函数的返回值: {:U('User/insert')} 编译后的PHP代码是 <?php echo U('User/insert');?> 2.执行函数但不输出 : 格式:{~function(-)} 例如,调用say_hello函数: {~say_hello('ThinkPHP')} 编译后的PHP代码是: <?php say_hello('ThinkPHP');?> thinkphp模板中使用函数的方法

discuz 使模板中的函数不解析 正常使用

<!--{if $_GET['zcdw']=="baxi"}--><!--{eval $duiwuxinxi = "巴西队";}--><!--{elseif $_GET['zcdw']=="deguo"}--><!--{eval $duiwuxinxi = "德国队";}--><!--{elseif $_GET['zcdw']=="agenting"}-

3.2 STL中的函数对象类模板

*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. 2)less是STL中最常用的函数对象类模板,其定义如下: template<class _Tp> struct less { bool oprator()(const _Tp&_x,const _Tp&_y)const { return _c<_y; } } 要判断两个i

Python中的函数对象与闭包

函数在Python中是第一类对象,可以当做参数传递给其他函数,放在数据结构中,以及作为函数的返回结果. 下面的例子为接受另外一个函数作为输入并调用它 1 #foo.py 2 def callf(func): 3 return func() 使用上面的函数: 1 import foo 2 def helloworld(): 3 return 'Hello,World' 4 5 print foo.callf(helloworld) >>>‘Hello,World’ 2.把函数当做数据处理时

8、泛型程序设计与c++标准模板库5.函数对象

1.函数对象 函数对象是STL提供的第四类主要组件,它使得STL的应用更加灵活方便,从而增强了算法的通用性.大多数STL算法可以用一个函数对象作为参数.所谓"函数对象"其实就是一个行为类似函数的对象,它可以不需要参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态. 在c++程序设计中,任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征,因此都可以作为函数对象传递给算法作为参数使用. 以数值算法accumulate()为例子,介绍函数对象

js中的函数对象

JavaScript三种定义函数方法: {}表示函数体1.第一种是使用function语句定义函数 function func() { } 2.第二种是使用Function()构造函数来定义函数(不常用) var 函数名 = new Function("参数1","参数2","参数3"--"函数体"); var sum = new Function("x","y","var z

Thinkphp 模板中直接对数据处理 模板中使用函数 中文字符串截取

1.Thinkphp 模板中直接对数据处理:{$data.name|substr=0,3} 2.中文字符串截取函数:mb_substr=0,14,'utf-8' 3.中文字符串统计:iconv_strlen(字符串,"UTF-8") <div style="margin-bottom: 8px;"> <a href="#" target="_blank" class="my_a" >