读书频道 > 网站 > 网页设计 > 深入应用C++11:代码优化与工程级应用
1.5.1 可调用对象
15-07-07    下载编辑
收藏    我要投稿   
在StackOverflow的最近一次世界性调查中,C++11在所有的编程语言中排名第二, C++11受到程序员的追捧是毫不意外的,因为它就像C++之父Bjarne Stroustrup说的:它看起来就像一门新的语言。C++11新增加了相当多的立即去当当网订购

1.5 std::function和bind绑定器

C++11增加了std::function和std::bind,不仅让我们使用标准库函数时变得更加方便,而且还能方便地实现延迟求值。

1.5.1 可调用对象

在C++中,存在“可调用对象(Callable Objects)”这么一个概念。准确来说,可调用对象有如下几种定义:

1)是一个函数指针。

2)是一个具有operator()成员函数的类对象(仿函数)。

3)是一个可被转换为函数指针的类对象。

4)是一个类成员(函数)指针。

它们在程序中的应用如代码清单1-16所示。

代码清单1-16 可调用对象的使用示例

void func(void)
{
   // ...
}

struct Foo
{
   void operator()(void)
   {
      // ...
   }
};

struct Bar
{
   using fr_t = void(*)(void);

   static void func(void)
   {
      // ...
   }

   operator fr_t(void)
   {
      return func;
   }
};

struct A
{
   int a_;

   void mem_func(void)
   {
      // ...
   }
};

int main(void)
{
   void(* func_ptr)(void) = &func; // 1. 函数指针
   func_ptr();

   Foo foo;                        // 2. 仿函数
   foo();

   Bar bar;                        // 3. 可被转换为函数指针的类对象
   bar();

   void (A::*mem_func_ptr)(void)   // 4. 类成员函数指针
         = &A::mem_func;
   int A::*mem_obj_ptr             //    或者是类成员指针
         = &A::a_;
   A aa;
   (aa.*mem_func_ptr)();
   aa.*mem_obj_ptr = 123;
   return 0;
}

从上述可以看到,除了类成员指针之外,上面定义涉及的对象均可以像一个函数那样做调用操作。

在C++11中,像上面例子中的这些对象(func_ptr、foo、bar、mem_func_ptr、mem_obj_ptr)都被称做可调用对象。相对应的,这些对象的类型被统称为“可调用类型”。

细心的读者可能会发现,上面对可调用类型的定义里并没有包括函数类型或者函数引用(只有函数指针)。这是因为函数类型并不能直接用来定义对象;而函数引用从某种意义上来说,可以看做一个const的函数指针。

C++中的可调用对象虽然具有比较统一的操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门。这样在我们试图使用统一的方式保存,或传递一个可调用对象时,会十分烦琐。
现在,C++11通过提供std::function和std::bind统一了可调用对象的各种操作。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站