gpt4 book ai didi

c++ - 在设置函数指针之前绑定(bind)参数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:56:29 28 4
gpt4 key购买 nike

我想尝试一些东西并在我们的一个动态库 API 包装器中统一一些样板代码。

基本上,我想做以下事情:

typedef bool (*MyFPtrT)(long id, std::string const& name);
typedef boost::function<bool (long id, std::string const& name)> MyFObjT;
...

...
MyFPtrT pDllFun = NULL;
long x = 42; string s = "Answer"; // API input, not hardcoded
MyFObjT f = boost::bind(pDllFun, x, s);
...
return Call(f);
...

template<FT>
bool Call(FT f) {
...
MyFPtrT pDllFun = (MyFunPtr)::GetProcAddress(...);
f.setFunctionPointerButLeaveBoundParameters(pDllFun); // <- how??
// Now call the correctly rigged up function object:
return f();
}

这可能吗? (使用 Boost 还是其他?)(C++03)

最佳答案

我认为不能像那样直接完成,因为 bind 创建一个新对象,该对象通过引用获取函数对象和参数,并且您不能重新绑定(bind)引用。

但是,您可以使用可重新分配的函数指针轻松编写自己的模板仿函数包装器:

template <typename R, typename A, typename B>
struct ReAssFunctor
{
typedef R(*FP)(A, B);

ReAssFunctor(const A & a_, const B & b_) a(a_), b(b_) { }

R operator()() const { return func(a, b); }

FP function;

private:
const A & a;
const B & b;
};

[编辑:]请检查下面的评论;在构造函数中持有由 const 引用获取的引用可能会被滥用,因此请小心,或者如果您愿意,可以按值保存 ab。[/]

现在您可以提前使用参数初始化仿函数:

ReAssFunctor<R, A, B> raf(a, b);

然后分配一个函数指针并调用:

raf.function = foo;
raf();

raf.function = goo;
raf();

你甚至可以用这个替换调用运算符(operator):

  template <typename U>
U operator()(U (f*)(A, B)) const { return f(a, b); }

然后以函数指针作为参数调用仿函数:

raf(fp1);  // calls fp1(a,b);
raf(fp2); // calls fp2(a,b);

在这种情况下,您不再需要将返回类型作为固定参数,但现在您不会获得无效调用运算符。随你挑吧。

关于c++ - 在设置函数指针之前绑定(bind)参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7028591/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com