7

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

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,所以任何方法的改变都是可能的。尽管如此,我希望我的代码的用户能够定义他们自己的c......

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

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

4

3 回答 3

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中完成。

于 2012-05-21T20:30:15.633 回答
1

好吧,如果您在编译时知道必须绑定 c 的内容,则可以定义一个新函数

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

这显然不是通用解决方案,但可能会解决您当前的问题。否则,K-ballo 的解决方案似乎是唯一简单的通用解决方案。但是,这要求您能够更改func. 如果您确实有一个无法触摸签名的 API,并且您仍然需要绑定一个参数并且如果上述解决方案不能解决您的特定情况:(注意,过度杀伤力)我一直想使用基于LLVM的解决方案,用于在运行时编译函数并在这种情况下传递其地址。

于 2012-05-21T20:37:25.060 回答
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);
}
于 2012-05-21T20:40:08.370 回答