как передать std::functional только ссылку на функтор, чтоб он не выделял память в куче?

Я хочу использовать std::function в качестве аналога сишного указателя на функцию. Как я понимаю, в случае когда в конструктор std::function передается функтор, происходит копироание/перемещение этого функтора со стека вызывающей стороны в кучу. Я бы хотел избежать этого денамического выделения памяти и передавать функтор как указатель на функцию, как мне это сделать?

struct test {
    void operator()() {
        std::cout << "a" << std::endl;
    }

    ~test() {
        std::cout << "destruct" << std::endl;
    }
};


int main() {
    auto t = test{};
    std::function<void()> a = t;
    a();
}

из примера видно что деструктор класса test вызывается 2 раза.


Ответы (1 шт):

Автор решения: Alex F
#include <iostream>
#include <functional>

struct test {
    void operator()() {
        std::cout << "a" << std::endl;
    }

    ~test() {
        std::cout << "destruct" << std::endl;
    }
};


int main()
{
    test t;
    std::function<void()> a(std::ref(t));
    a();

    return 0;
}

Деструкор вызывается один раз. Вопрос, нужно ли вам такое поведение. std::function не имеет своей собственной копии функтора, только reference на функтор, который должен храниться где-то в другом месте. То есть, вы отвечаете за lifetime функтора.

→ Ссылка