2016-02-03 95 views
2

我试图做的是什么,这意味着在我的编译器调试输出感:什么是std :: _ Bind <std :: _ Mem_fn <void(ClassName :: *)()>(ClassName *)>是什么意思? (C++)

std::_Bind<std::_Mem_fn<void (ClassName::*)()>(ClassName*)> 

如果它的事项,它被用来做为所被用作类型的模板变量的值一个类成员变量。

知道我不知道的位"ClassName::*"(谷歌是真的当你要搜索的内容最重要的一点就是非字母数字位)

+0

我猜测与'this'指针作为参数所捕获的成员函数,东西的'的std ::绑定(类:: OBJ,&MyObj中)编译器形成的;' –

+0

我要去采取猜测'_Bind'是'std :: bind'返回的实现类型,'_Mem_fn'也是类似的。我猜这是微软的。 – chris

+0

这是有道理的,因为我正在使用std :: bind,但是我绑定的所有函数都有一个int返回值,所以void从哪里来? – Illiander

回答

5

随着参考位你知道你不知道,ClassName::*

ClassName::*是一个类型的一部分(但只有部分) - 完整的类型是void (ClassName::*)(),这是一个member function pointer

语法具体地在这里,有一个指针指向一个ClassName成员函数,它返回void和没有参数。

void (ClassName::*)() 
    ^  ^ ^
     |   |  | 
return type  |  | 
(void)   |  | 
       |  | 
class type ------+  | 
(ClassName)    | 
         | 
parameter list ---------+ 
(no parameters)  

至于类型,std::_Bind<std::_Mem_fn<void (ClassName::*)()>(ClassName*)>的其余部分,这是调用std::bind

的内部表示的std::bind签名如下:

template< class F, class... Args > 
/*unspecified*/ bind(F&& f, Args&&... args); 

注意不明回报类型 - 这意味着它由实施决定什么std::bind返回:

返回值
未指定类型T的函数对象,这std::is_bind_expression<T>::value == true

所以在这个特定的实现,std::bind你已经通过了回报std::_Bind<std::_Mem_fn<void (ClassName::*)()>(ClassName*)>

ClassName成员函数这有用吗?

一两件事你可以用std::bind返回类型要做的就是捕捉它在std::function

特别std::function类型的问题在这里是std::function<void()>

ClassName obj; 
std::function<void()> func = std::bind(&ClassName::someFunction, &obj); 

func(); // this actually calls obj.someFunction() 
+0

这一切都有很大的意义,除了我使用绑定的唯一成员函数具有返回类型的int。更详细地说,所有使用绑定的函数都使用这个原型:'std :: function '(是的,我使用了std :: placeholders :: _ 1 ...在我传递给Bind()的过程中) – Illiander

+0

函数的返回类型不构成其签名的一部分(请参见[这里](http://stackoverflow.com/questions/290038/is-the-返回类型部分功能签名)) –

+0

您确定要发布正确版本的_ _Bind吗?传递给''bind'的成员函数指针('void(ClassName :: *)()')与注释中的不匹配,它将是'int(ClassName :: *)( int,int,bool&)' –

相关问题