2012-05-21 48 views
6

我需要一个函数指针作为自变量的函数:C++用作其他函数的参数绑定功能

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

回答

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

+2

即使我需要C++ 98代码,这个答案很容易转换成相当于boost的提升。 – romeovs

1

好吧,如果你知道在编译的时候,你必须绑定c。与什么,你可以定义一个新的功能

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

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

0

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

虽然上面的回答会的工作,这里是另一种选择:

如果内func参数为c(),在使用中的一个,是恒定的,你可以写一个包装功能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); 
} 
相关问题