的笔记

随时随地编辑

耍点C++11/14的小流氓

C普拉斯普拉斯耶标准委员会的无上尊宠的元老们是不是晚年耍得很high耶

所谓耍流氓,耍,玩弄,流氓,不忍淬读的技巧


lambda


lambda
[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

传返回值:
auto Foo = []()-> Type { return Value;}
函数声明了返回值类型,但是似乎可以不返回值

thread

<占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
  • <占位项1>
  • <占位项2>

  • template

    <占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
  • <占位项1>
  • <占位项2>

  • bind

    provides support for partial function application, i.e. binding arguments to functions to produce new functions.
    丫就一lambda,参考cplusplus的示例, 参考cppreference的示例。 bind上2个玩意后,就产生了一个新玩意,这个新玩意可以拿来当一般方法来访问了。

    功效

  • 特化函数参数组装成一个新函数,例如让第二个形参固定,特化嘛
  • 强制转换函数返回值,淫家本来返回float,搞个bind(fun, _1),返回int了,硬是掰弯了
  • 暴露类成员方法,用bind产生一个新方法,这样可以用类的某个对象call新方法了
  •   auto newfun = std::bind (&MyClass::foo,_1)
      MyClass obj1,obj2;
    如此,可以这样搞了:
      newfun(obj1);newfun(obj2);
    爽了2把哈?

    总结下bind类成员方法的规则:
    bind(成员方法的坑,类对象的坑,形参1的坑,新参2的坑)
    bind(&MyClass::memberfun,&obj或者_1,常量或_2,常量或_3)


    cplusplus示例中fn_five()产生的调用堆栈

    my_divide()
    TestClient.exe!std::_Invoker_functor::_Call
    TestClient.exe!std::invoke
    TestClient.exe!std::_Invoke_ret
    TestClient.exe!std::_Call_binder,std::tuple<> >
    TestClient.exe!std::_Binder::operator()<>
    

    function

    屁话不多说了,直接看cppreference示例
    还可以参考:
  • http://www.cplusplus.com/reference/functional/function/

  • 接2句废话,可以这样将类成员方法和对象绑定成一个新方法,是不是在处理网络消息协议时很有用哇

    using std::placeholders::_1;
    // store a call to a member function and object
    std::function f_add_display2 = std::bind(&Foo::print_add, foo, _1);
    f_add_display2(2);
    
    // store a call to a member function and object ptr
    std::function f_add_display3 = std::bind(&Foo::print_add, &foo, _1);
    f_add_display3(3);
    

    placeholders

    This namespace declares an unspecified number of objects: _1,_2,_3,..., which are used to specifyplaceholdersin calls to functionbind.

    启用placeholders

    using namespace std::placeholders; // adds visibility of _1, _2, _3,...
  • http://www.cplusplus.com/reference/functional/placeholders/

  • forward

    <占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
  • <占位项1>
  • <占位项2>

  • 小流氓

    <占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
  • <占位项1>
  • <占位项2>

  • 小流氓

    <占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
  • <占位项1>
  • <占位项2>

  • 小流氓

    <占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
  • <占位项1>
  • <占位项2>

  • posted on 2017-01-14 18:48 的笔记 阅读(206) 评论(0)  编辑 收藏 引用 所属分类: C++


    只有注册用户登录后才能发表评论。
    网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理