将状态传递给函数指针

3

我正在使用一个外部库中的函数,这个函数的类型如下:

int libraryFunction(int* fp(int))

然而,我需要将回调函数也传递给一个 ostream,但是库函数没有任何允许函数对象、lambda表达式或传递额外参数的重载。有没有办法将 ostream 传递给回调函数?


这是一个C++库,只不过是一个非常古老的库。 - Woofmao
1
你能选择 int 参数吗,还是它被库使用了? - Ben Voigt
除非您在类中使用“静态”成员和函数,或者使用老式的全局变量,否则我看不到其他方法。 - PaulMcKenzie
您是否需要为不同的回调使用不同的输出流?您是否一次只需要一个回调?如果是这样,您可以使用全局变量来保存输出流。否则,在这个签名下,我真的想不到一个好的方法来实现这个。 - md5i
对于我的特定情况,我想我可以只使用全局变量。我不太喜欢这个库... - Woofmao
显示剩余2条评论
2个回答

0
传递 int,并使用它来查找回调所需的所有内容。如果只是一个 ostream...
#include <iostream>
#include <functional>
#include <fstream>
#include <map>
int main() {
    enum {
         jkout = 0,
         cout = 1
    };
    std::map<int, std::ostream*> lookup;
    std::ofstream jout("junk.txt");
    lookup[jkout] = &jout;
    lookup[cout] = &std::cout;
    *(lookup[jkout]) << "hello\n";
    return 0;
}

1
转瞬间,我有了那种加一的感觉。然后就是一个匆匆而过的点击者。 - Jive Dadson

0
如果库API不支持函数对象或传递自定义状态指针,则必须在您的一侧存储对象(这里是ostream)的状态。
由于函数是无状态的,因此除了在编译时已知的位置存储状态或状态指针之外,没有其他选择。
这种方法的问题在于,您必须确保状态的生命周期与库中回调的生命周期相匹配。 ostream不能过早地被销毁。
另一个问题是,除非您可以传递某种索引到您的函数,否则您将不得不为每个所需状态声明单独的函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接