Передача указателя на функцию в качестве аргумента другой функции в std :: bind

Я пытаюсь обернуть переданную функцию внутри предложения try-catch, чтобы я мог отловить исключения, которые она выдает, и выполнить некоторую очистку перед повторным выбросом. Я написал пример кода, который повторяет мою ошибку компиляции.

#include <functional>
#include <iostream>
#include <queue>
#include <string.h>
#include <stdexcept>

using namespace std;

void foo(int a){
throw runtime_error("died");
}

template<class F,class ...Args>
void gen(F&& f,Args&&... args){
auto wrap = [](F f,Args... args){

try{
f(args...);
}catch(exception& e){
std::cout << "Caught exception" <<std::endl;
}

};

auto bound = std::bind(wrap, std::forward<F> (f),
std::forward<Args>(args)...);

bound();
}

int main()
{

gen(foo,5);

return 0;
}

Я не могу понять, как передать указатель функции в лямбда-выражение или вызов связывания. Кажется, сообщает об ошибке при вызове bound (). Может кто-нибудь дать какой-нибудь совет или сказать мне, если я что-то недопонимаю?

5

Решение

Ваша проблема на самом деле довольно проста: тип, выведенный для F&& бывает void(int) скорее, чем void(*)(int), Однако вы не можете скопировать функцию, в то время как вы можете скопировать указатель на функцию. То есть, есть одно решение проблемы с вашей проблемой:

gen(&foo, 5);

Передайте указатель на функцию, а не функцию.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]