как передать 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 шт):
#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 функтора.