将函数指针作为参数传递给std :: bind中的另一个函数

时间:2012-09-17 22:33:09

标签: c++ c++11 stdbind

我试图在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;
}

我似乎无法弄清楚如何将函数指针传入lambda表达式或bind调用。它似乎在调用bound()时报告错误。有人可以提出一些建议或者告诉我是否存在我误解的事情?

1 个答案:

答案 0 :(得分:1)

您的问题实际上相当简单:F&&推导出的类型恰好是void(int)而不是void(*)(int)。但是,您可以在复制函数指针时复制函数。也就是说,您的问题有一个字符修复:

gen(&foo, 5);

将指针传递给函数而不是函数。