【问题标题】:Passing in function pointer as argument to another function in std::bind将函数指针作为参数传递给 std::bind 中的另一个函数
【发布时间】:2012-09-10 04:26:33
【问题描述】:

我试图将传入的函数包装在 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 表达式或绑定调用。似乎在调用bound() 时报错。如果我有什么误解,有人可以给我一些建议或告诉我吗?

【问题讨论】:

  • 您是否打算将gen() 返回bound 以便您可以在其他地方使用它?如果没有,为什么要使用 lambda?
  • 完全正确,我打算退货。

标签: c++ c++11 stdbind


【解决方案1】:

您的问题实际上很简单:为F&amp;&amp; 推导的类型恰好是void(int) 而不是void(*)(int)。但是,不能复制函数,但可以复制函数指针。也就是说,有一个字符可以解决您的问题:

gen(&foo, 5);

传递一个指向函数而不是函数的指针。

【讨论】:

  • 谢谢,您指出问题出在右值绑定上。不幸的是,虽然这修复了我的示例,但我的真实代码将调用 gen(forward(foo),5),其中它有一个 foo 的右值传递给它,其方式与 gen() 非常相似。在这种情况下,&foo 似乎不起作用。
  • 不,当然不是:你想更进一步!在某些时候,你有一个实际的功能。这是您需要获取地址的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 2019-08-17
  • 1970-01-01
  • 2023-03-30
  • 2017-08-07
  • 2021-07-18
相关资源
最近更新 更多