当std::bind遇到非静态类成员函数

当std::bind遇到⾮静态类成员函数
bind9之前看项⽬代码在实现表驱动⽅法时,经常会遇到这样的代码:
// enum { ID0, ID1, ID2 };
// std::map<int, std::function<void()>> Foo::m;
// void Foo::func0(){}
// void Foo::func1(){}
// void Foo::func2(){}
void Foo::init()
{
m[ID0]= std::bind(&Foo::func0,this);
m[ID1]= std::bind(&Foo::func1,this);
m[ID2]= std::bind(&Foo::func2,this);
}
时间长了以后,我⼀度认为std::bind的第⼀个参数是⼀个⾮静态类成员函数时,第⼆个参数只能是相应类对象指针,因为⼀直以来都有⾮静态类成员函数的第⼀个参数是隐含的this指针的说法。直到遇到下⾯的代码:
asio::async_write(socket_, asio::buffer(message_),
boost::bind(&tcp_connection::handle_write,shared_from_this(),
asio::placeholders::error,
混合所有制与国企改革新思路
asio::placeholders::bytes_transferred));
红统一图库 彩图2018第⼆个参数还能是std::shared_ptr
#include<iostream>
#include<functional>
tp0class Foo
{
public:
Foo(int key):m_key(key)
{}
void print()
{
std::cout <<"key: "<< m_key << std::endl;
}
static Foo create(int key)
{
Foo result(key);
return result;
}
private:PKPM下节点
int m_key;
};
template<typename T>
class PtrWrapper
{
public:
PtrWrapper(T *p):m_p(p)
{}
T &operator*()
{
return*m_p;
}
private:
T *m_p;
};
int main()
{
// 绑定到指针
汪定国
Foo foo0(0);
auto f0 = std::bind(&Foo::print,&foo0);
f0();
// 绑定到对象
Foo foo1(1);
auto f1 = std::bind(&Foo::print, foo1);
f1();
// 绑定到对象引⽤
Foo foo2(2);
auto f2 = std::bind(&Foo::print, std::ref(foo2));
f2();
/
/ 绑定到另⼀个可调⽤对象
auto f3 = std::bind(&Foo::print, std::bind(&Foo::create, std::placeholders::_1));
f3(3);
// 绑定到placeholder
Foo foo4(4);
auto f4 = std::bind(&Foo::print, std::placeholders::_1);
f4(foo4);
// 绑定到实现了T &operator*()的对象
Foo foo5(5);
PtrWrapper<Foo>pw(&foo5);
auto f5 = std::bind(&Foo::print, pw);
f5();
return0;
}
我总结出了6类情况,具体类别可见代码中的注释。std::shared_ptr对应的是最后⼀种情况。感觉好⿇烦,还是⽤lambda表达式吧。

本文发布于:2024-09-24 21:26:08,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/692919.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:代码   对象   指针
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议