Поскольку std::function
может содержать функции-члены, он должен где-то хранить указатель на экземпляр объекта.
Как я могу получить указатель this
из std::function
, содержащего функцию-член?
Поскольку std::function
может содержать функции-члены, он должен где-то хранить указатель на экземпляр объекта.
Как я могу получить указатель this
из std::function
, содержащего функцию-член?
Объект типа std::function
содержит вызываемый объект. Указатель на функцию-член — это своего рода вызываемый объект; его можно вызвать с аргументом соответствующего типа класса, а также любыми дополнительными аргументами, которые ему нужны. Например:
struct S {
void f(int);
};
std::function<void(S, int)> g(&S::f);
Чтобы вызвать его, передайте объект типа S
:
S s;
g(s, 3);
Обратите внимание, что объект std::function
не содержит объект S
; только когда вы вызываете его, указатель функции привязывается к объекту.
std::function
, в другую функцию. Как я могу сделать это тогда? Под разворачиванием я имею в виду разделение его на указатель this
и указатель статической функции, используя std::function::target
для дальнейшей обработки.
- person danijar; 01.04.2013
this
и позволяет выполнять поиск.
- person Pubby; 01.04.2013
std::function
, тогда это уже привязанный указатель this
?
- person danijar; 01.04.2013
this
. Какие бы аргументы он ни захватывал, они сохраняются в объекте, и нет никакого механизма для их извлечения. Если вам нужно это сделать, лямбда-выражение, вероятно, не то, что вам следует использовать.
- person Pete Becker; 01.04.2013
std::bind
, если я правильно понимаю. Но почему тогда .target()
возвращает нулевой указатель?
- person danijar; 01.04.2013
std::function::target
— это шаблонная функция; когда вы вызываете его, вы должны указать тип, который вы ищете. Если этот тип хранится в объекте, вы возвращаете указатель на вызываемый объект. Если это не правильный тип, вы получите нулевой указатель.
- person Pete Becker; 01.04.2013
function<Handle<Value>(Arguments const &)>
. Я пытаюсь привести это к необработанному указателю функции с сигнатурой Handle<Value>(Arguments const &)
. Но, возможно, из-за того, что я использовал предложение захвата, он возвращает нулевой указатель. Но вы ответили на вопрос, который я задал. Если вы все еще хотите мне помочь, перейдите по ссылке, которую я разместил в комментарии под вопросом.
- person danijar; 01.04.2013