Как вызвать std :: function после перехода к shared_ptr - PullRequest
1 голос
/ 14 апреля 2019

Я застрял на том, как вызвать функцию std ::, которая была перемещена в shared_ptr…

#include <iostream>
#include <functional>

using func_type = std::function<int()>;

int main(int, char*[])
{   
    func_type func = [] () { return 42; };
    std::cout << func() << "\n"; // -> 42
    auto sp_func = std::make_shared<func_type>(std::move(func));
    // how do we now call the function?
}

Буду благодарен за любые (умные) указатели в правильном направлении.

1 Ответ

2 голосов
/ 14 апреля 2019

Ну, вы только что создали (умный) указатель, который указывает на вашу функцию. Все, что вам нужно сделать для доступа к объекту - это разыменование этого указателя, а затем вы получите свою функцию обратно.

В этом случае вы должны просто использовать (*sp_func)().

Примечания:

  1. Убедитесь, что заключены в скобки, чтобы разыменовать указатель перед попыткой вызова функции; оператор вызова имеет более высокий приоритет, чем оператор разыменования.
  2. Вы никогда не должны больше полагаться на перемещенный объект. То есть никогда в вашем коде не пытайтесь вызвать func() сразу после этого шага. Это неопределенное поведение . Вы действительно не знаете состояние перемещенного объекта.
...