У меня возникают проблемы с пониманием сигнатур функций и указателей.
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::*)()
указывает на функцию с сигнатурой, что?