[英]Can I bind to a function that takes default arguments and then call it?
如何绑定到接受默认参数的函数,而不指定默认参数,然后在没有任何参数的情况下调用它?
void foo(int a, int b = 23) {
std::cout << a << " " << b << std::endl;
}
int main() {
auto f = std::bind(foo, 23, 34); // works
f();
auto g = std::bind(foo, 23); // doesn't work
g();
using std::placeholders::_1;
auto h = std::bind(foo, 23, _1); // doesn't work either
h();
}
基本上, foo(x)
编写foo(x)
,编译器都会将其转换为foo(x, 23);
。 它只适用于您实际使用函数名称直接调用的情况。 例如,你不能将&foo
赋给void(*)(int)
,因为函数的签名是void(int, int)
。 默认参数不参与签名。 如果将其分配给void(*)(int, int)
变量,则有关默认参数的信息将丢失:您无法通过该变量利用默认参数。 std::bind
在其内部的某处存储void(*)(int, int)
,因此丢失了默认参数信息。
C ++中没有办法从函数外部获取参数的默认值,因此在绑定时手动提供默认值时会遇到困难。
我想你可以使用lambda来模拟你想要的行为。
有点像这样:
auto g = [] (){ foo( 23 ); };
编辑:刚检查,似乎工作正常: http : //ideone.com/SPSvi
我有两个解决方案:
1 - 您可以重载foo()并让它使用默认值调用原始文件:
void foo(int a, int b)
{
std::cout << a << " " << b << std::endl;
}
inline void foo(int a)
{
foo(a, 23);
}
2 - 您可以使用静态变量作为默认值,然后在绑定过程中使用它:
static int foo_default_b = 23;
void foo(int a, int b = foo_default_b)
{
std::cout << a << " " << b << std::endl;
}
auto g = std::bind(foo, 23, foo_default_b);
g();
这个答案不同意R. Martinho Fernandes的回答。 你确实可以使用boost::bind
绑定到默认参数,你只需要放置占位符,如下所示:
boost::bind<void (int, int)>(foo, _1, _2)(12);
这将按预期调用foo(12, 23)
。 虽然我没有测试这个特定的代码,但是我在代码中基于上面链接的答案做了类似的事情,并且它在gcc 4.8.5
。
嗯,我刚刚注意到这是在询问std::bind
,而不是boost::bind
。 我不知道有什么不同,如果有的话。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.