我有一个需要函数指针作为参数的函数:
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
。
答案 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);
}