【问题标题】:Pass specialized function pointers in c++在 C++ 中传递专门的函数指针
【发布时间】:2012-11-05 07:30:27
【问题描述】:

我正在使用我的c++ 代码中的c 库。他们的API 要求我传递具有给定签名的某个函数指针。假设它类似于以下内容:

typedef int (*api_fun_t)(int);

我想要做的是传递依赖于在运行时确定的某些参数的函数指针。最初我想定义如下内容:

api_fun_t my_specialized_fun(int param){
    int fun(int x){
        // decide what to do based on param
    }
    return fun;
}

但问题c++ 不允许嵌套函数定义。接下来我想我可以通过如下模板来实现这一点

template <int param>
fun (int x){
    //decide what to do based on param
}

还有其他不涉及全局和/或静态变量的方法吗?

【问题讨论】:

  • 函数指针数组怎么样?
  • @Nick 这行不通,因为参数仅在运行时确定,所以我无法列出数组中所有可能的函数
  • 但我无法将函子传递给c 库!它只理解api_fun_t 类型的对象。我基本上可以在一个类中实现嵌套函数。问题是参数和类方法都需要是静态的......
  • 如果你不能使用 C++ 模板也不行。
  • 我正在使用c++ 并且可以使用模板!我只是想知道是否有办法做到这一点。

标签: c++ function templates function-pointers


【解决方案1】:

使用 C++11 lambda 代替嵌套函数。 例如:

typedef int (*api_fun_t)(int);

api_fun_t my_specialized_fun(int param){
   return [](int x) {x++; return x;};
}

【讨论】:

  • 你能给我举个例子吗?我很想知道它是如何工作的
  • 我看不出这有什么帮助。 lambda 无法访问param
  • @ymett 不需要:if(param == val1) return lambda1; if(param == val2) return lambda2;... 请注意,即使允许嵌套函数,由于与 lambda (需要状态,而函数指针显然没有)。
  • 这并不比一个函数指针数组好,提问者在对问题的评论中拒绝了它 - “这不起作用,因为参数仅在运行时确定,所以我不能列出所有可能的函数数组”。
【解决方案2】:

假设 API 允许您传递用户参数(就像所有设计良好的 C 风格回调 API 一样),使用结构来保存数据,并将指向它的指针作为参数传递。然后,您可以使用结构的成员数据或酌情调用成员函数。您必须确保结构的生命周期足够长。

如果 API 不允许您传递用户参数,您唯一的选择是全局变量,如果多线程是一个问题,则为线程局部变量。并给 API 的设计者写一封愤怒的电子邮件。

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多