Что такое `R (* pf) (void *, Args ...)`, указатель функции на метод? - PullRequest
0 голосов
/ 22 сентября 2019

Я видел этот тип здесь .Я полагаю, что он пытается создать переменную pf для стертого указателя на член (вот почему там void*).Затем я заметил эту сигнатуру типа в подобных классах.

Но согласно isocpp тип указателя нестатического члена определяется следующим образом: int (Fred::*)(char,float) (для некоторого класса Fred)и тип указателя на функцию определяется следующим образом: int (*)(char,float)

Следовательно, можно создать переменную-указатель члена mp, например: int (S::*mp)(int) = nullptr;

Может быть, это void* представляет this* и это еще один способ определить переменную-указатель члена путем определения переменной-указателя функции?Возможно ли это?

Что такое R(*pf)(void*, Args...)?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2019

Это объявление указателя на функцию.Ничего больше.

Совместимые функции принимают void* и Args... и возвращают R.

В данном примере совместимая функция, назначенная указателю, являетсялямбда.void* - это стертый по типу адрес некоторого вызываемого f, а члены Args... являются, ну, аргументами, которые будут переданы этому вызываемому.Тип вызываемого объекта восстанавливается путем захвата псевдонимов типа внутри лямбды (хорошо!).

2 голосов
/ 22 сентября 2019

R(*pf)(void*, Args...) - это указатель на функцию (обычный, а не указатель на член) на функцию, которая возвращает R и имеет параметры (void*, Args...), где Args... - список типов (расширенный параметр шаблонаpack).

Может быть, это void* представляет this* и это еще один способ определить переменную-указатель члена

Нет, в C ++ такой функции нет.

Если вы посмотрите на код , этому указателю присваиваются только лямбды, например:

pf = [](void* ptr, Args... args)->R{
  return blah;
};

Я не уверен, почему вы ожидалиуказатели на участников, которые будут вовлечены.

...