C ++绑定函数用作其他函数的参数

时间:2012-05-21 20:26:28

标签: c++ bind

我有一个需要函数指针作为参数的函数:

int func(int a, int (*b)(int, int))
{
    return b(a,1);
}

现在我想在这个函数中使用一个具有三个参数的函数:

int c(int, int, int)
{
    // ...
}

如何绑定c的第一个参数,以便我能够:

int i = func(10, c_bound);

我一直在关注std::bind1st,但我似乎无法弄明白。它不会返回一个函数指针吗?我有充分的自由来适应func所以任何方法的改变都是可能的。 Althoug我希望我的代码的用户能够定义他们自己的c ...

请注意,以上是我正在使用的实际功能的凶猛简化。

该项目遗憾地需要C++98

3 个答案:

答案 0 :(得分:12)

你做不到。您必须先修改func以获取函数对象。类似的东西:

int func( int a, std::function< int(int, int) > b )
{
    return b( a, rand() );
}

事实上,b不需要成为std::function,而是可以模仿:

template< typename T >
int func( int a, T b )
{
    return b( a, rand() );
}

但是为了清晰起见,我会坚持使用std::function版本,并且在错误上编译输出稍微复杂一些。

然后你可以做类似的事情:

int i = func( 10, std::bind( &c, _1, _2, some-value ) );

请注意,所有这些都是 C ++ 11 ,但您可以使用Boost在 C ++ 03 中执行此操作。

答案 1 :(得分:1)

好吧,如果你在编译时知道,你需要绑定c,你可以定义一个新函数

int c_bound(int a, int b) {
   return c(a,b,some_value);
}

这显然不是通用的解决方案,但可能会解决您当前的问题。否则K-ballo的解决方案似乎是唯一容易通用的解决方案。但是,这要求您能够更改func的签名。如果你真的有一个API,你不能触摸签名,你仍然需要绑定一个参数,如果上面的解决方案没有解决你的具体情况:(小心,过度杀伤)我&#39;我一直想使用基于LLVM的解决方案在运行时编译函数并在这种情况下传递其地址。

答案 2 :(得分:0)

你将无法使用3参数函数作为2参数函数;主要是因为没有真正的方法来确定第三个参数会做什么。

虽然上述答案可行,但还有另一种选择:

如果在c()中使用func的其中一个参数是常量,则可以为c(int, int, int)编写包装函数:

int d(int a, int b)
{
   return c(a, b, 0); //use a constant parameter
}

或者,如果您可以从两个给定参数中确定第三个参数,您也可以尝试:

int e(int a, int b)
{
    int extra = 0;
    ///Determine extra from a, and b
    return c(a, b, c);
}