Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std:_绑定什么<;标准::_Mem_fn<;void(类名::*)()>;(类名*)>;什么意思?(C+;+;)_C++_Templates - Fatal编程技术网

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()