http://my.oschina.net/u/555701/blog/219844?fromerr=dYUxPs2r
std::function
类模版 std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标进行存储、复制、和调用操作,这些目标包括函数、lambda表达式、绑定表达式、以及其它函数对象等。
struct
Foo {
Foo(
int
num) : num_(num) {}
void
print_add(
int
i)
const
{ cout << num_+i <<
'\n'
; }
int
num_;
};
std::function<
void
(
const
Foo&,
int
)> f_add_display = &Foo::print_add;
Foo foo(2);
f_add_display(foo, 1);
std::bind
bind是一组用于函数绑定的模板。在对某个函数进行绑定时,可以指定部分参数或全部参数,也可以不指定任何参数,还可以调整各个参数间的顺序。对于未指定的参 数,可以使用占位符_1、_2、_3来表示。_1表示绑定后的函数的第1个参数,_2表示绑定后的函数的第2个参数,其他依次类推。
class
A
{
public
:
void
fun_3(
int
k,
int
m)
{
cout<<k<<
" "
<<m<<endl;
}
};
A a;
auto
f5 = bind(&A::fun_3, a,placeholders::_1,placeholders::_2);
f5(10,20);
//print:10 20
std::function<
void
(
int
,
int
)> fc = std::bind(&A::fun_3, a,std::placeholders::_2, 2);
fc(20);
//print:2 20
CC_CALLBACK
##_VA_ARGS_是可变参数宏
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALCC_CALLBACK_1(HelloWorld::menuCloseCallback,this)LBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3 ##__VA_ARGS__)
void
HelloWorld::menuCloseCallback(Object* pSender,
int
a,
int
b)
{
std::cout<<a<<
" "
<<b<<std::endl;
Director::getInstance()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit
(0);
#endif
}
在回调函数中输出 a b
|
|
CC_CALLBACK_ 的宏定义是 std::bind 那么我们可以直接使用std::bind。如下:
auto
closeItem = MenuItemImage::create(
"CloseNormal.png" ,
"CloseSelected.png" ,
std::bind(&HelloWorld::menuCloseCallback, this ,std::placeholders::_1,1,2));
|
|