【发布时间】:2016-12-26 06:35:07
【问题描述】:
我无法理解函数签名和指针。
struct myStruct
{
static void staticFunc(){};
void nonstaticFunc(){};
};
int main()
{
void (*p)(); // Pointer to function with signature void();
p = &myStruct::staticFunc; // Works fine
p = &myStruct::nonstaticFunc; // Type mismatch
}
我的编译器说myStruct::nonstaticFunc()的类型是void (myStruct::*)(),但这不是指向它的指针的类型吗?
我问是因为当您创建 std::function 对象时,您传递了您希望它指向的函数的函数签名,例如:
std::function<void()> funcPtr; // Pointer to function with signature void()
not
std::function<void(*)()> funcPtr;
如果我必须根据void() 的模式进行猜测,我会说:
void myStruct::();
or
void (myStruct::)();
但这是不对的。我不明白为什么我应该添加星号只是因为它是非静态的而不是静态的。也就是说,指针void(* )()指向带有签名void()的函数,而指针void(myStruct::*)()指向带有签名什么的函数?
【问题讨论】:
-
你不能在
std::function中持有一个成员函数而不将它绑定到一个类对象。指向成员的指针不像常规的函数指针。 -
不能将成员函数直接赋值给
std::function,需要绑定 -
我知道如何指向非静态成员函数,我只需声明 void(myStruct::*)();但我想知道它的签名是什么,因为 void(*)() 指向的函数的签名是 void()
-
@TitoneMaurice - 如果您只想存储成员函数以供以后使用,请参阅我的编辑。
-
C++ 没有任何特定的签名格式。成员函数的签名在 1.3.20 中定义为
name、参数类型列表 (8.3.5)、函数所属的类、cvqualifiers (如果有)和 ref-qualifier(如果有) 。请注意签名中包含名称。