Как получить этот указатель из std::function?

Поскольку std::function может содержать функции-члены, он должен где-то хранить указатель на экземпляр объекта.

Как я могу получить указатель this из std::function, содержащего функцию-член?


person danijar    schedule 01.04.2013    source источник
comment
Вы взглянули, например, на en.cppreference.com/w/cpp/utility/functional/function?   -  person Oliver Charlesworth    schedule 01.04.2013
comment
@ОлиЧарльсворт. Конечно, я сделал. Скажи мне, если я был слеп к ответу.   -  person danijar    schedule 01.04.2013
comment
Я почти уверен, что такого рода информация намеренно не выставляется в библиотеке и, следовательно, недоступна переносимым способом.   -  person Kerrek SB    schedule 01.04.2013


Ответы (1)


Объект типа std::function содержит вызываемый объект. Указатель на функцию-член — это своего рода вызываемый объект; его можно вызвать с аргументом соответствующего типа класса, а также любыми дополнительными аргументами, которые ему нужны. Например:

struct S {
    void f(int);
};
std::function<void(S, int)> g(&S::f);

Чтобы вызвать его, передайте объект типа S:

S s;
g(s, 3);

Обратите внимание, что объект std::function не содержит объект S; только когда вы вызываете его, указатель функции привязывается к объекту.

person Pete Becker    schedule 01.04.2013
comment
Моя цель — развернуть лямбды, которые я передал как std::function, в другую функцию. Как я могу сделать это тогда? Под разворачиванием я имею в виду разделение его на указатель this и указатель статической функции, используя std::function::target для дальнейшей обработки. - person danijar; 01.04.2013
comment
@danijar: Почему бы вам вместо этого не указать свою цель в вопросе? В вашем вопросе мало смысла. - person GManNickG; 01.04.2013
comment
@danijar, вы можете создать свой собственный функциональный объект, который связывает указатель this и позволяет выполнять поиск. - person Pubby; 01.04.2013
comment
@danijar, если это статическая функция, связанного экземпляра объекта нет. - person Drew Dormann; 01.04.2013
comment
Когда я сохраняю лямбда-выражение как std::function, тогда это уже привязанный указатель this? - person danijar; 01.04.2013
comment
@danijar - лямбда-функция не обязательно имеет указатель this. Какие бы аргументы он ни захватывал, они сохраняются в объекте, и нет никакого механизма для их извлечения. Если вам нужно это сделать, лямбда-выражение, вероятно, не то, что вам следует использовать. - person Pete Becker; 01.04.2013
comment
@ПитБеккер. Спасибо, так что ссылка вроде как привязана, как std::bind, если я правильно понимаю. Но почему тогда .target() возвращает нулевой указатель? - person danijar; 01.04.2013
comment
@danijar — std::function::target — это шаблонная функция; когда вы вызываете его, вы должны указать тип, который вы ищете. Если этот тип хранится в объекте, вы возвращаете указатель на вызываемый объект. Если это не правильный тип, вы получите нулевой указатель. - person Pete Becker; 01.04.2013
comment
@ПитБеккер. Лямбда приходит как параметр типа function<Handle<Value>(Arguments const &)>. Я пытаюсь привести это к необработанному указателю функции с сигнатурой Handle<Value>(Arguments const &). Но, возможно, из-за того, что я использовал предложение захвата, он возвращает нулевой указатель. Но вы ответили на вопрос, который я задал. Если вы все еще хотите мне помочь, перейдите по ссылке, которую я разместил в комментарии под вопросом. - person danijar; 01.04.2013