我在具有此类型的外部库中使用函数:
int libraryFunction(int* fp(int))
但是,我还需要将回调传递给ostream
,并且库函数没有任何允许仿函数,lambdas或传递额外参数的重载。有没有办法让ostream
进入回调?
答案 0 :(得分: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 :(得分:0)
如果库API不支持函数对象或传递自定义状态指针,那么您必须存储对象的状态(此处为ostream
)。
该函数是无状态的,除了在编译时已知位置存储状态或指向状态之外别无选择。
这样做的缺陷是你必须确保状态的生命周期与库中回调的生命周期相匹配。 ostream
不得早点销毁。
另一个问题是,除非你可以将某种索引传递给你的函数,否则你必须为你需要的每个状态声明一个单独的函数。