C++ std:_绑定什么<;标准::_Mem_fn<;void(类名::*)()>;(类名*)>;什么意思?(C+;+;)
我试图理解这在我的编译器调试输出中意味着什么:C++ std:_绑定什么<;标准::_Mem_fn<;void(类名::*)()>;(类名*)>;什么意思?(C+;+;),c++,templates,C++,Templates,我试图理解这在我的编译器调试输出中意味着什么: std::_Bind<std::_Mem_fn<void (ClassName::*)()>(ClassName*)> std::\u绑定 如果重要的话,它将被用作模板变量的值,而模板变量将被用作类成员变量的类型 我知道我不确定的是“ClassName::*”(当你搜索的重要部分是非字母数字部分时,谷歌真的很糟糕)关于你不确定的部分,ClassName::*: ClassName::*是类型的一部分(但只是部分)-完整的
std::_Bind<std::_Mem_fn<void (ClassName::*)()>(ClassName*)>
std::\u绑定
如果重要的话,它将被用作模板变量的值,而模板变量将被用作类成员变量的类型
我知道我不确定的是
“ClassName::*”
(当你搜索的重要部分是非字母数字部分时,谷歌真的很糟糕)关于你不确定的部分,ClassName::*
:
ClassName::*
是类型的一部分(但只是部分)-完整的类型是void(ClassName::*)()
,这是
具体地说,这里有一个指向ClassName
成员函数的指针,该函数返回void
,不带任何参数
void (ClassName::*)()
^ ^ ^
| | |
return type | |
(void) | |
| |
class type ------+ |
(ClassName) |
|
parameter list ---------+
(no parameters)
至于类型的其余部分,std::_Bind
,这是调用的内部表示
std::bind
的签名如下:
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
我猜捕获的成员函数带有
this
指针作为参数,是由std::bind(&class::obj,&myobj)构成的编译器
我将猜测\u Bind
是std::Bind
和\u Mem\u fn
返回的实现类型。我猜这是微软的。这是有道理的,因为我使用的是std::bind,但是我绑定的所有函数都有一个int返回,那么这个空从何而来?如果这是微软的,那么我就是一只死企鹅。这是GCC输出,我在Linux上运行。这一切都很有意义,除了我在bind上使用的唯一成员函数的返回类型为int。更详细地说,所有使用bind的函数都使用这个原型:“std::function”(是的,我在传递给bind()的内容中使用std::placeholder:_1…)函数的返回类型不构成其签名的一部分(请参阅)。您确定发布的是正确版本的\u Bind
?传递给您正在发布的bind
(void(ClassName::*)()
)的成员函数指针与您的注释中的指针不匹配,该指针是int(ClassName::*)(int,int,bool&)
,结果证明您是对的,我还有几个绑定调用,我已经完全忘记了。
ClassName obj;
std::function<void()> func = std::bind(&ClassName::someFunction, &obj);
func(); // this actually calls obj.someFunction()